标题:递归程序出现奇怪的问题了,求大神解答。
只看楼主
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
结帖率:100%
已结贴  问题点数:20 回复次数:8 
递归程序出现奇怪的问题了,求大神解答。
下面这个程序计算x的n次方的值,x和n都限制为正整数。大家看有注释的报错的那一行,为什么要修改成return power(x, n / 2) * power(x, n / 2)才不报错呢?
谢谢高手热情指导!

//对于x^n,如果n是偶数,利用公式x^n = (x^n/2)^2
//若果n是奇数,则x^n = x * x^n-1
//这个程序使用了递归
#include <stdio.h>
#include <stdlib.h>

int power(int x, int n);

int main()
{
    int x, n;
    printf("Enter x and n: ");
    scanf("%d%d", &x, &n);

    printf("The value is %d", power(x, n));
    return 0;
}

int power(int x, int n){
    if (n == 0)
        return 1;
    else if (n != 0 && n %2 == 0)
        return power(power(x, n / 2), 2);//这一行报错
    else
        return x * power(x, n - 1);
}
搜索更多相关主题的帖子: include return 正整数 Enter power 
2014-09-03 21:29
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
得分:20 
简单说说:

1   return power(power(x, n / 2), 2);//这一行报错  
 看起来你的编译器很智能  
我们使用递归一定要注意有2点 ~1:一定要有跳出递归的条件 也称为递归出口
                            ~2:递归过程一定要向着递归出口前进去递归,否则就死循环了
你的递归结束条件是  power(int x, int n ) n==1  
 你看你调用power(int x, 2),它去调用 power(y, 2),
power(y, 2), 接着去调用 power(z, 2), ...结果死循环了

可能你说 我没有调用power(x , 2)啊 记得:递归没有条件,必须在各条件下都要有递归出口

所以 你的编译器很智能

2014-09-03 21:43
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
得分:0 
回复 2 楼 erty1001
我知道了:在n为偶数时,会产生power(x, n) = power(power(x, n / 2), 2) = power(power(power(x, n / 2), 1), 2) = ...,n一直为偶数,递龟没法结束。
IDE是Code:Blocks 13.12,编译器是GNU GCC Compiler,用起来感觉很好。
谢谢大神回复,解答了我的疑惑!
2014-09-03 22:24
szgg520
Rank: 5Rank: 5
等 级:职业侠客
威 望:3
帖 子:79
专家分:307
注 册:2011-6-13
得分:0 
小伙不错嘛,一点就通了

[url=http://www.]深圳复印机出租[/url]
2014-09-04 07:57
书生等待
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:280
专家分:689
注 册:2013-2-22
得分:0 
#include <stdio.h>
#include <stdlib.h>

int power(int x, int n);

int main()
{
    int x, n;
    printf("Enter x and n: ");
    scanf("%d%d", &x, &n);

    printf("The value is %d", power(x, n));
    return 0;
}

int power(int x, int n){
    if (n == 0)
        return 1;
    else
        return x* power(x, n - 1);
}


没明白楼主为什么一定要区分n的奇偶啊,上面的代码一样能有结果啊,楼主解释下嘞
2014-09-04 09:39
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
程序代码:
#include <stdio.h>

unsigned power( unsigned x, unsigned n );

int main()
{
    unsigned x, n;
    printf( "%s", "Enter x and n: " );
    scanf( "%d%d", &x, &n );
    printf("The value is %d", power(x,n) );

    return 0;
}

unsigned power( unsigned x, unsigned n )
{
    if( n == 0 )
        return 1;
    unsigned t = power(x,n/2);
    return t*t*( n%2 ? x : 1 );
}
2014-09-04 11:55
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用书生等待在2014-9-4 09:39:51的发言:
 
没明白楼主为什么一定要区分n的奇偶啊,上面的代码一样能有结果啊,楼主解释下嘞

因为题目要求使用快速幂算法,你的算法太慢不符合题意
2014-09-04 11:57
书生等待
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:280
专家分:689
注 册:2013-2-22
得分:0 
回复 7 楼 rjsp
嗯,明白了,谢版主
2014-09-04 15:25
随风而行lulu
Rank: 2
等 级:论坛游民
帖 子:59
专家分:60
注 册:2014-9-6
得分:0 
回复 2 楼 erty1001
很好的解答!!
2014-09-09 02:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-435656-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.105714 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved