深究Python中的递归【建议收藏】

前言:本博文主要讲解Python中的递归,以前在C#中也讲过递归的一些知识——深刻理解C#方法重载和递归,有兴趣的朋友能够阅读一下!
python

1、递归的应用场景

递归是一种编程思想,应用场景:web

  1. 在咱们平常开发中,若是要遍历一个文件夹下面全部的文件,一般会使用递归来实现。
  2. 在后续的算法课程中,不少算法都离不开递归,例如:快速排序。

递归的特色:算法

  • 函数内部本身调用本身。
  • 必须有出口。

递归算法:递归(Recursion),在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。编程

2、生活中的递归

1. 故事案例

  1. 咱们使用的词典,自己就是递归,为了解释一个词,须要使用更多的词。当你查一个词,发现这个词的解释中某个词仍然不懂,因而你开始查这第二个词,惋惜,第二个词里仍然有不懂的词,因而查第三个词,这样查下去,直到有一个词的解释是你彻底能看懂的,那么递归走到了尽头,而后你开始后退,逐个明白以前查过的每个词,最终,你明白了最开始那个词的意思。
  2. 多年前我五岁的儿子问我「不是每条船都有救生艇的吧?」「怎么会呢?」「也许救生艇上会有一艘更小的救生艇,可是那艘小艇上可能就没有更小的救生艇了。」
  3. 一个洋葱是一个带着一层洋葱皮的洋葱。

2. 图片案例

在这里插入图片描述

3、递归的应用案例

1. 应用:3之内数字累加和

  • 代码
# 3 + 2 + 1
def sum_numbers(num):
    # 1.若是是1,直接返回1 -- 出口
    if num == 1:
        return 1
    # 2.若是不是1,重复执行累加并返回结果
    return num + sum_numbers(num-1)


sum_result = sum_numbers(3)
# 输出结果为6
print(sum_result)
  • 执行结果
    在这里插入图片描述

2. 应用:n之内数字阶乘

# 阶乘函数
def Fact(n):
    if n == 1:
        return 1
    return n * Fact(n-1)

3. 应用:斐波拉契数列

def Fibo(n):
    # 出口
    if n == 1 or n == 2:
        return 1
    else:
        return Fibo(n - 1) + Fibo(n - 2)

4、递归的特色

  1. 必须有一个明确的结束条件。
  2. 每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减小。
  3. 递归效率不高,递归层次过多会致使栈溢出(在计算机中,函数调用是经过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。因为栈的大小不是无限的,因此,递归调用的次数过多,会致使栈溢出),此时程序会抛出错误:超出最大递归深度。
  1. 递推:像上边递归实现所拆解,递归每一次都是基于上一次进行下一次的执行,这叫递推。
  2. 回溯:则是在遇到终止条件,则从最后往回返一级一级的把值返回来,这叫回溯。

补充:本博文关于递归的故事案例、图片案例均引用自知乎,感谢读者阅读!数据结构