关于递归运算的形态与表现方式

看标题,我为什么说的是递归运算,而非递归算法呢?因为这个本身非算法类的,而是一种思路。(当然有的时候我们就把思路叫成算法,这个也是正常的)做程序员这么久了,但是依然没有对递归有所深刻的理解,这次花了大量的时间去运算递归例子,最后得到了论证。递归的特征要求就是:有一个入口,一个出口;就是一个终止条件,一个条件。我曾经在百度里看到这样一个对于递归的解释:引用: 用递归法计算n!可用下述公式表示: n!=1 (n=0,1) n×(n-1)! (n>1) 按公式可编程如下: long ff(int n) { long f; if(n<0) printf("n<0,input error"); else if(n==0||n==1) f=1; else f=ff(n-1)*n; return(f); } main() { int n; long y; printf("/ninput a inteager number:/n"); scanf("%d",&n); y=ff(n); printf("%d!=%ld",n,y); } 程序中给出的函数ff是一个递归函数。主函数调用ff后即进入函数ff执行,如果n<0,n==0或n=1时都将结束函数的执行,否则就递归调用ff函数自身。由于每次递归调用的实参为n-1,即把n-1的值赋予形参n,最后当n-1的值为1时再作递归调用,形参n的值也为1,将使递归终止。然后可逐层退回。 下面我们再举例说明该过程。设执行本程序时输入为5,即求5!。在主函数中的调用语句即为y=ff(5),进入ff函数后,由于n=5,不等于0或1,故应执行f=ff(n-1)*n,即f=ff(5-1)*5。该语句对ff作递归调用即ff(4)。进行四次递归调用后,ff函数形参取得的值变为1,故不再继续递归调用而开始逐层返回主调函数。ff(1)的函数返回值为1,ff(2)的返回值为1*2=2,ff(3)的返回值为2*3=6,ff(4)的返回值为6*4=24,最后返回值ff(5)为24*5=120。 例8.5也可以不用递归的方法来完成。如可以用递推法,即从1开始乘以2,再乘以3…直到n。递推法比递归法更容易理解和实现。但是有些问题则只能用递归算法才能实现。典型的问题是Hanoi塔问题。可能别人看起来理解了,但是我人笨,没办法,只好自己多用功了。最后我得出以下结论:递归运算过程:a=5;a*fun(a-1);然后依次循环下去就是这样的,当然这个也是我个人理解而以:‘5*(5-1);然后形参变成了4,因为一开始的时候5-14*(4-1);4*3*(3-1);4*3*2*(2-1);最后的结果就是:24以上的结构,我算来算去,结果都和程序运算一致,最后变成了我的论证,呵呵其实整个过程里迭代器都是这个函数体,而非乘号前面的参数,所以才导致前面的参数一直连接着。仔细看下其中的规律就容易明白了,如下:复制内容到剪贴板代码:4*(4-1);4*3*(3-1);4*3*2*(2-1);以至现在终于理解了递归的形态与表现方式。(对于我这个只有小学学历的人来讲,能找到递归规律也许已经算不容易了,还是有一定的满足感的)当然了,这个也只是我找出的规律,也许和大家对递归的理解有偏差,请海涵指正。以上实属个人看法与笔算与计算机常用函数对等结果,哪里有错,请高人回复指正。www.okpython.com本论坛里有很多关于数据结构与算法的书籍资源与教程希望大家常来交流探讨,python中国期待您的交流。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值