回复 10楼 々NARUTO
我个人觉得你对递归的理解有些偏差,如果要设计一个递归函数fun(n),只要能把fun(n)转换成fun(n-1)的问题,并且当n为特定值时(比如n=1)问题的答案是已知的,就可以了,而不必关心fun(n-1)是如何计算出来的,这正是递归的优势,因为如果搞清楚fun(n-1)的情况,那就直接用循环就可以了,因为递归需要更多的资源,速度也没有循环快,实际上一个问题只要能转换成一个分段函数的形式,使用递归实现是非常方便的。如下几个例子不知是否有助于理解递归:1. s(n)=1+2+3+.....+n
1 当n=1时
s(n)=
s(n-1)+n 当n>1时 不必关心s(n-1)如何计算出
对应的递归函数:
int S(int n)
{
int sum;
if(n==1)
sum=1;
else
sum=S(n-1)+n; /*不必关心如何计算出S(n-1)*/
return sum;
}
2. S(a,b)=f(x)在[a,b]上的定积分
假设运用矩形法计算,S(a,b)可以转换成如下分段函数:
f(a)*(b-a) 当|a-b|足够小(比如小于1e-6)
S(a,b)=
S(a,(a+b)/2)+S((a+b)/2,b) 当|a-b|>1e-6时 不必关心S(a,(a+b)/2)和S((a+b)/2,b)如何计算出来
对应的递归函数是:
float S(float a,float b)
{
float sum;
if(fabs(a-b)<=1e-6)
sum=f(a)*(b-a); /*假设f(x)已经定义*/
else
sum=S(a,(a+b)/2)+S((a+b)/2,b); /*不必知道S(a,(a+b)/2)如何计算出来*/
return sum;
}
3. bprint(n)=打印出十进制数n对应的二进制
打印n 当n<2时
bprint(n)=
bprint(n/2) 当n>2时,先打印n/2对应的二进制,然后再打印n对应的二进制的最后1位(n%2)
打印 n%2
对应的递归函数:
void bprint(int n)
{
if(n<2)
printf("%d",n);
else
{
bprint(n/2); /*不必关心如何打印出n/2对应的二进制*/
printf("%d",n%2);
}
}
[ 本帖最后由 helloUJS 于 2013-5-4 13:48 编辑 ]