Python中函数的递归调用

        函数调用自己的编程方式被称为函数的递归调用递归通常能够将一个大型的复杂问题的递归条件,一层一层的回溯到终止条件,然后再根据终止条件的运算结果,一层一层的递进运算到满足全部的递归条件。它能够使用少量程序描述出解题过程中的重复运算部分,减少程序的代码量。要使用递归的方式进行编程,需要在编程的时候规划好终止条件,写好递归条件,用回溯的逻辑方法解决问题。

下面我们来举个例子:

1.使用递归函数,求斐波那契数列的前10个数

def fib(n):
    if n==1 or n==0:
        return 1
    else:
        return fib(n-2)+fib(n-1)

for n in range(10):
    print(fib(n),end='\t')

说明:斐波那契数列是一个常用的数学数列,第n个斐波那契数fib(n)由以下两个条件决定:

1 n = 0n = 1时:

  fib(0) = 1fib(1) = 1

 (2) n > 1时:

  fib(n) = fib(n-1) + fib(n-2)

【代码分析】

(1) 第1行,在定义一个名为fib的函数,传递给这个函数的参数为n。

(2) 由题设,斐波那契数列中,n == 0或n == 1时,fib(0) 与fib(1) 都等于 1,我们把这个叫做终止条件。

(3) 第2、3行,在程序中实现终止条件。终止条件,一般都会给定一个或多个数值,或实现某些特定操作。

(4) 由题设,斐波那契数列中,从第三个数开始,第n个斐波那契数的数值,是由公式fib(n) = fib(n-1) + fib(n-2)计算得到,我们称这个是递归条件。

(5) 第5行,在程序中实现了递归条件。

(6) 第7、8行,使用循环,传递0到9,共10个数字进fib函数

(7) 当n == 0 和n == 1时,fib的返回值都为1。

(8) 当n == 2时,第3行不会运行,会运行第5行。第5行中,会调用fib(0)和fib(1),会执行:fib(2) = fib(0) + fib(1)。

(9) 当n == 3时,第2行、第3行不会运行,会运行第5行。第5行中,会调用fib(1)和fib(2),会执行:fib(3) = fib(1) + fib(2)。但是fib(2)此时会重复(7)中所描述的动作,所以此时fib(3) = fib(1) + fib(2) = fib(1) + (fib(0) + fib(1))。

(10) 当n == 4时,第2行、第3行不会运行,会运行第5行。第5行中,会调用fib(2)和fib(3),会执行:fib(4) = fib(2) + fib(3)。但是fib(2)此时会重复(7)中所描述的动作,fib(3)会重复(8)中所描述过程,所以此时fib(4) = fib(2) + fib(3) = (fib(0) + fib(1)) + (fib(1) + fib(2)) =  (fib(0) + fib(1)) + (fib(1) + (fib(0) + fib(1)))。

        每次n无法满足终止条件时,fib(n)都会回溯到fib(n-1)和fib(n-2),只有当n满足了终止条件(n == 0和n == 1)时,fib(n)才会返回一个确定值,然后根据这个确定的值开始计算。简单的说,递归函数,会执行上述过程……、(10)、(9)、(8),直到(7)。

注意:

        当递归层数超过了系统允许的最大递归深度。默认情况下,当递归调用到1000层,Python解释器将终止程序。递归深度是为了防止无限递归错误而设计的,当用户编写的正确递归程序需要超过1000层时,可以通过如下代码设定:

    import sys

    sys.setrecursionlimit(2000)  #2000是新的递归层数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清潇沈默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值