Python递归函数调用原理VS案例分析

2022-02-1420:32:44编程语言入门到精通Comments1,124 views字数 999阅读模式

一、什么是递归函数?

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

二、函数的递归调用原理

  • 实际上递归函数是在栈内存上递归执行的,每次递归执行一次就会耗费一些栈内存。
  • 栈内存的大小是限制递归深度的重要因素

三、案例分析

  1. 求阶乘

计算阶乘n! = 1 x 2 x 3 x … x n,文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

可以用函数fact(n)表示。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

fact(n) = n! = 1 x 2 x 3 x … x (n-1) x n = (n-1)! x n = fact(n-1) x n
fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。

于是,fact(n)用递归的方式写出来就是:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

def fact(n):    if n == 1:        return 1    return n * fact(n - 1)

如果计算fact(6),可以根据函数定义看到计算过程如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

def fac(n):    if n==1:        return 1    else:        res=n*fac(n-1)        return  res
print(fac(6))

运行结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

Python递归函数调用原理VS案例分析文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

  1. 斐波拉契级数

有这样一个数列:1,1,2,3,5,8,13,21,34…。其第一元素和第二个元素等于 1,其他元素等于其前面两个元素的和。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

def fab(n):  # 定义斐波拉契级数    if n in [1, 2]:  # 如果n=1或者2      return 1    return fab(n - 1) + fab(n - 2)  # n>2

print(fab(1))  # 斐波拉契级数的第一个元素
print(fab(2))  # 斐波拉契级数的第二个元素
print(fab(8))  # 斐波拉契级数的第8个元素print(fab(13))  # 斐波拉契级数的第9个元素   

运行结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

Python递归函数调用原理VS案例分析文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

  1. 递归函数的优点

定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

递归需要注意递归的深度。由于递归会产生多次函数调用,而函数调用会消耗代码的栈空间,如果递归的深度太大,会导致栈溢出。以上面的阶乘为例,如果计算 100000 的阶乘,在一般机器上都会出现栈溢出的问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

print(fac(10000))

如下所示:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

Python递归函数调用原理VS案例分析文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

四、总结

本文基于Python基础。Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出。介绍了在使用递归函数的优缺点,优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

在实际案例中,针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环,进行详细的讲解。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/23140.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/23140.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定