递归与汉诺塔问题
递归与汉诺塔问题
总结递归的两个特点:
- 调用自身
- 结束条件
理解以下两个函数的递归输出结果:
def func1(x):
if x > 0: # 结束条件
print(x)
func1(x - 1) # 调用自身,x每次调用都会改变
func1(3)
>>>3
>>>2
>>>1
def func2(x):
if x > 0:
func2(x - 1)
print(x)
func2(3)
>>>1
>>>2
>>>3
递归的定义:程序调用自身的编程技巧称为递归
- 一般来说,递归需要有边界条件,递归前进段和递归返回段
- 当边界条件满足时,递归返回,当边界条件不满足时,递归前进。
def fib(n):
if n == 0:
return 1
value = n*fib(n-1)
print(f'n:{n},value:{value}')
return value
fib(4)
递归和栈的关系:
递归过程分为两步:"递"和"归",分别对应着栈的两种操作:"进栈" 和 "出栈"
如:条件满足时(进栈):
当n =0时,条件不满足(出栈):依次将结果返回,最后得到 fib(4)
汉诺塔问题:
如何将所有的圆盘从A移动到C,要求每次只能移动一个盘子,盘子只能在3个标杆(A/B/C)之间移动,更大的盘子不能放在更小的盘子上面。
要求:输入汉诺塔的层数,输出整个移动过程。
当n = 2时:
- 把小圆盘从A移动到B
- 把大圆盘从A移动到C
- 把小圆盘从B移动到C
扩展:当n个盘子时
- 把n-1个圆盘从A经过C移动到B
- 把第n个圆盘移动到C (只有这一步是合法操作,一次只能移动一个盘子)
- 把n-1个圆盘从B经过A移动到C
def hanoi(n, a, b, c):
if n > 0:
# 把n-1个圆盘从A经过C移动到B
hanoi(n - 1, a, c, b)
# 把第n个圆盘从A移动到B
print('moving from %s to %s' % (a, c))
# 把第n-1圆盘从B经过A移动到C
hanoi(n - 1, b, a, c)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现