首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

这样的递归该怎么理解

2012-02-22 
这样的递归该如何理解?longintpow(longintX,unsignedintN){/*1*/if(N0)/*2*/return1/*3*/if(N1)/*4*/

这样的递归该如何理解?
long   int   pow(long   int   X,unsigned   int   N)
{
    /*1*/   if(N==0)
    /*2*/       return   1;
    /*3*/   if(N==1)
    /*4*/       return   X;
    /*5*/   if(IsEven(N))
    /*6*/         return   pow(X*X,N/2);
                else
    /*7*/         return   pow(X*X,N/2)*X);
}

这是计算X的N次幂的算法,IsEven(N)是判断N是不是偶数的一个函数。
第七行还可以写成pow(X,N/2)*pow(X,N/2);
这样的递归是如何执行的??
若将第六行改成return   pow(pow(X,2),N/2)或return   pow(pow(X,N/2),2)将会产生一个死循环,为什么??

[解决办法]
return pow(pow(X,N/2),2)

第二个pow(X,N/2),参数一直没变,肯定死循环,除非已开始N/2就是0或1才能return
[解决办法]
递归是否停止取决于N的大小,return pow(pow(X,N/2),2)最外面一个pow 的参数固定为2,如果IsEven(N)不断执行else 的分支,那么就会一直递归下去停止不了。
[解决办法]
若将第六行改成return pow(pow(X,2),N/2)或return pow(pow(X,N/2),2)

注意两种情况中都有一个 pow 参数恒为 2,
那么无论怎么递归,
总是无法满足递归终止条件 N==0 or N==1,
无限递归了 ...
[解决办法]
return pow(pow(X,N/2),2)

pow(?,2),参数2一直没变,肯定死循环!
[解决办法]
mark

热点排行