else fact=w* fact ( w-1);
return fact; }
递归调用执行情况如下:
int fact (int w) {1if ( w==0) 2 fact= 1; 3else 4fact=w* fact( w-1); }
递归思路
实际上, 递归思路是把一个不能或不好直接求解 的“大问题”转化成一个或几个“小问题”来解决, 再把这些“小问题”进一步分解成更小的“小问题” 来解决,如此分解,直至每个“小问题”都可以直接解 决(此时分解到递归出口)。
但递归分解不是随意的分解,递归分解要保证“大 问题”与“小问题”相似,即求解过程与环境都相似。 并且有一个分解的终点。从而使问题可解。
假 设 f(A,i-1) 已 求 出 , 则 f(A,i)=MIN(f(A,i1),A[i]),其中MIN()为求两个值较小值函数。因 此得到如下递归模型:
A[0] 当i=0时 f(A,i)=
MIN(f(A,i-1),A[i]) 其他情况
由此得到如下递归求解算法:
float f(float A[],int i) { float m;
n!
n
1, (n 1)!,
当n 0时 当n 1时
该问题的算法为: int Fact ( int n )
{ int m; if (n= =0) return(1); else { m=n*Fact(n-1); return(m); } }
例如: 试编一个递归函数,求第n项Fibonacci级数的
} } // delete
5.3 递归算法到非递归算法的转换
递归算法有两个基本特性:一是递 归算法是一种分而治之的、把复杂问 题分解为简单问题的求解问题方法,对 求解某些复杂问题,递归算法分析问题 的方法是十分有效的;二是递归算法 的时间/空间效率通常比较差。