目录
一、认识递归
递归:即方法(函数)自己调用自己的一种特殊编程写法。
函数调用自己,即称之为递归调用。
def func():
If ....:
func()
return .....
递归通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
如:把n个问题转换为n-1个问题,找到n-1个问题的解
注意:函数调用函数,注意递归出口,避免死循环
二、阶乘问题
# n! = n * (n - 1)!
def f(n):
# 递归出口(先写):保证所有递归都会从出口出去
if n <= 1:
return 1
ans = n * f(n-1)
return ans
print(f(5))
#结果
120
三、经典例题:汉诺塔问题
注意:考虑n个盘子的时候,我们认为只有两个,即上面所有的盘子和最下面的盘子,将上面(n-1)个盘子看做一个整体,
1、(n-1)个盘子,从A挪到B,中间通过C来挪动,这就变成了递归的问题move(n-1,A,C,B)
2、然后移动剩余一个盘子:A->C
3、最后将n-1个盘子,从B挪到C(我们只考虑开始和结尾,中间过程不关心),中间通过A,move(n-1,B,A,C)
4、n=1时,递归出口
# n=(n-1)+1
# 定义函数move,表示n个盘子,从A挪到C,中间通过B来挪动
def move(n,A,B,C):
if n == 1:
print(f"{A}->{C}")
return
# 1、将n-1个盘子从A挪到B
move(n-1,A,C,B)
# 2、将剩余1个盘子从A挪到C
move(1,A,B,C)
# print(f"{A}->{C}")
# 3、将n-1个盘子从B挪到C
move(n-1,B,A,C)
move(3,"A","B","C")
#结果
A->C
A->B
C->B
A->C
B->A
B->C
A->C
递归要注意:
- 递归出口
- 当前问题如何变成子问题