一、递归
递归Recursion是一种解决问题的方法
- 将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。
- 递归的问题分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身。
- 递归为我们提供了一种对复杂问题的优雅解决方案,精妙的递归算法常会出奇简单。
重要:递归“三定律”
- 递归算法必须有一个基本结束条件(最小规模问题的直接解决)
- 递归算法必须能改变状态向基本结束条件演进(减小问题规模)
- 递归算法必须调用自身(解决减小了规模的相同问题)
示例:使用递归对数列进行求和
- 数列的和=“首个数”+“余下数列”的和
- 如果数列包含的数少到只有1个的话,它的和就是这个数了。这是规模小到可以做最简单的处理
- 问题分解为更小规模的相同问题,并表现为“调用自身”
- 对“最小规模”问题的解决:简单直接
def list_sum(num_list):
if len(num_list) == 1: # 基本结束条件
return num_list[0]
else:
# 减少规模,向长度为1的状态演进,并调用自身
return num_list[0] + list_sum(num_list[1:])
list1 = [1, 3, 5, 7, 9]
print(list_sum(list1))
### 输出结果
25
二、递归实现分析
当一个函数被调用的时候,系统会把调用时的现场数据压入到系统调用栈
- 每次调用,压入栈的现场数据称为栈帧
- 当函数返回时,要从调用栈的栈顶取得返回地址,恢复现场,弹出栈帧,按地址返回。
Python中的递归深度限制
- Python中的递归深度限制,默认最大递归深度为1000。超过最大递归深度会出现
RecursionError
错误。 - 这时候要检查程序中是否忘记设置基本结束条件,导致无限递归。
import sys
print(sys.getrecursionlimit())
sys.setrecursionlimit(2000)
print(sys.getrecursionlimit())
### 输出结果
1000
2000
三、递归可视化-分形树
Python内置turtle海龟绘图模块模拟海龟在沙滩上爬行而留下的足迹
动作类别 | 方法名 | 参数 | 说明 |
---|---|---|---|
爬行 | forward(n) | n | 向前爬行n个单位长度 |
爬行 | backward(n) | n | 向后爬行n个单位长度 |
转向 | left(a) | a | 向左转动a度 |
转向 | right(a) | a | 向右转动a度 |
抬笔放笔 | penup() | 无 | 抬起画笔,移动时不画线 |
抬笔放笔 | pendown() | 无 | 放下画笔,移动时开始画线 |
笔属性 | pensize(s) | s | 设置画笔线条的粗细为s |
笔属性 | pencolor© | c< |