【转】递归方法思路一

转自 http://sjjg.js.zwu.edu.cn/SFXX/zhanduilie/zhanduilie3.1.4.2.html

递归方法思路:
     第一步骤(递归步骤):将规模较大的原问题分解为一个或多个规模更小、但具有类似于原问题特性的子问题。即较大的问题递归地用较小的子问题来描述,解原问题的方法同样可用来解这些子问题。
     第二步骤:确定一个或多个无须分解、可直接求解的最小子问题(称为递归的终止条件)。
  【例】非负整数n的阶乘可递归定义为:
  
                           

与之相应的C函数框架是:
int fac(int n)
{ float p;
if ( (n==0) || (n==1) ) p=1;
else p=n*fac(n-1);
return(p);
}
  在此函数中可理解为求n!用fac(n)来表示,那么fac(n-1)就表示求(n-1)!。图3.6(a)展示了递归调用中执行情况。从图3.6(a)可以看到fac函数共被调用5次,即fac(5)、fac(4)、fac(3)、fac(2)、fac(1)。其中fac(5)main函数调用的,其余4次是在fac函数中调用的。在某一层递归调用时,并未立即得到结果,而是进一步向深度递归调用。直到最内层函数执行n=1或n=0时,fac(n)才有结果。然后再一一返回时,不断得到中间结果,直到回到主程序就可得到n!的最终结果。

  调用时把处在调用层的不同n值入栈,返回时再一一出栈参加计算。存放不同n值的栈如图3.6(b)所示。当然这里也用到了返回地址栈,在此不再重复。

 

 

posted @ 2013-03-22 14:38  muzhi121  阅读(342)  评论(0)    收藏  举报