递归函数

什么是递归:当函数直接或间接调用自己时,则发生递归。
在数学上,斐波纳契数列被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
通过迭代计算斐波那契数列代码如下:
def fibo(n):
    befor = 1
    now = 0
    after = 0
    for i in range(n):
        after = now + befor
        befor = now
        now = after
    return now
print(fibo(8))
而通过递归来完成这个任务:
def fibo(n):
    if n <= 2:
        return 1
    return fibo(n-2)+fibo(n-1)
print(fibo(8))
这样做代码更短,但也更难理解
迭代的方法对斐波那契数列的描述为:F(-1)=1,F(0)=0,F(n)=F(n-1)+F(n-2) ,F(n+1)=F(n)+F(n-1)
递归的方法对斐波那契数列的描述为:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)
迭代方法的描述起来更像数学归纳法推理过程:
递推的基础:证明当n=1时表达式成立。
递推的依据:证明如果当n=m时成立,那么当n=m+1时同样成立。
而递归方法描述起来更像是数学归纳法的结论。
斐波纳契数列被以递归的方法定义,而它的描述看起来数学归纳法的结论,那么我们是不是可以用数学归纳法思考方式去思考递归?
答案是肯定的。
保罗·格雷厄姆(Paul Graham)在《ANSI Common Lisp》一书中提到, 关于递归你只需要做两件事情:
  1. 你必须要示范如何解决问题的一般情况, 通过将问题切分成有限小并更小的子问题.
  2. 你必须要示范如何通过有限的步骤, 来解决最小的问题(基本用例).
  3. 如果这两件事完成了, 那问题就解决了. 因为递归每次都将问题变得更小, 而一个有限的问题终究会被解决的, 而最小的问题仅需几个有限的步骤就能解决.
这个描述像是数学归纳法换了种表述。
递归的基础:证明当n=1时成立,但也是很容易被新人忽略的,如果去掉if n <= 2:的判断语句之后,代码就会陷入死循环。
递归函数特点:
1、自己直接(或间接)调用自己
2、递归函数需要一个结束条件,不然代码会进入死循环
3、但凡递归能做的循环一样可以做,只是有时候递归代码更简洁
4、实现同样的功能,一般情况下递归的效率往往低于迭代的效率,且占用更多内存。
5、一般情况下迭代远远比递归更好理解,所以通常推荐使用迭代方法
引用:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值