目录
一、基本介绍
二、递归能解决什么问题?
三、递归案例
1、打印问题
2、阶乘问题
四、递归重要规则
五、课堂练习
1、斐波那契数
2、猴子吃桃问题
3、汉诺塔
一、基本介绍
1、简单地说:递归就是函数自己调用自己,每次调用时传入不同的值
2、递归有助于编程者解决复杂问题,同时可以让代码变得简洁
二、递归能解决什么问题?
1、各种数学问题,如8皇后问题,汉诺塔,阶乘问题,迷宫问题等等
2、各种算法中也会使用到递归,如快排,归并排序,二分查找,分治算法等
3、将用栈解决的问题->递归,代码比较简洁
三、递归案例
1、打印问题
# 打印问题
def test(n):
if n>2:
test(n-1)
print("n =", n)
# 调用test(4)
test(4)
2、阶乘问题
# 阶乘问题
def factorial(n):
if n==1:
return 1
else:
return factorial(n-1)*n
# 打印4的阶乘
print(factorial(4))
四、递归重要规则
1、执行一个函数时,就创建一个新的空间(栈空间)
2、函数的变量是独立的,比如,变量n
3、递归必须向退出递归的条件逼近,否则就是无限递归,就会出现RecursionError: maximum recursion depth exceeded
4、当一个函数执行完毕,或遇到return,就会返回,遵守谁调用,就将结果返回给谁
五、课堂练习
1、斐波那契数
请使用递归的方式求出斐波那契数1,1,2,3,5,8,13...给你一个整数n,求出它的值是多少?
# 斐波那契数
def fbn(n):
"""
功能:返回n对应的斐波那契数
:param n:
:return:
"""
if n==1 or n==2:
return 1
# 如果n>2,则对应的斐波那契数为n-1和n-2对应的斐波那契数的和
else:
return fbn(n-1)+fbn(n-2)
# 完成测试
print(fbn(7)) # 13
2、猴子吃桃问题
猴子吃桃问题:有一堆桃子,猴子第1天吃了其中的一半,并再多吃一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第10天时,想再吃时(即还没有吃),发现只有1个桃子了。问题:最初有多少个桃子?
# 猴子吃桃问题
"""
思路分析:
1、day==10时,有桃子数 1
2、day==9时,day9-day9/2-1=day10
有桃子数 day9=(day10+1)*2
3、day==8时,有桃子数 day8=(day9+1)*2
"""
# 定义函数,返回对应天数对应的桃子数
def peach(day):
if day==10:
return 1
# 如果是1<=day<10,的范围就是从后一天开始推导
else:
return (peach(day+1)+1)*2
# 完成测试
print("最初的桃子数为:", peach(1)) # 1534
3、汉诺塔
# 汉诺塔
def hanoi_tower(num, a, b, c):
"""
输出指定 num个盘子的移动顺序
:param num: 指定盘子数
:param a: 表示A柱子
:param b: 表示B柱子
:param c: 表示C柱子
:return:
"""
# 如果只有一个盘子
if num == 1:
print("第1个盘从:", a, "->", c)
else:
# 有多个盘,我们认为只有两个,上面所有的盘和最下面的盘
# 移动上面所有的盘从A移动到B柱子,这个过程会借助到C柱子
hanoi_tower(num - 1, a, c, b)
# 移动最下面的盘,从A移动到C柱子
print(f"第{num}个盘从: {a} -> {c}")
# 把上面所有的盘从B移动到C柱子,这个过程会借助到A柱子
hanoi_tower(num - 1, b, a, c)
# 完成测试
hanoi_tower(3, "A", "B", "C")