读书人

这样的递归该怎么理解

发布时间: 2012-02-22 19:36:56 作者: rapoo

这样的递归该如何理解?
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

读书人网 >C语言

热点推荐