递归与汉诺塔问题

递归与汉诺塔问题

总结递归的两个特点:

  • 调用自身
  • 结束条件

理解以下两个函数的递归输出结果:

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)

image-20230926091107848

递归和栈的关系:

递归过程分为两步:"递"和"归",分别对应着栈的两种操作:"进栈" 和 "出栈"

如:条件满足时(进栈):

image-20230926092044728

当n =0时,条件不满足(出栈):依次将结果返回,最后得到 fib(4)

汉诺塔问题:

如何将所有的圆盘从A移动到C,要求每次只能移动一个盘子,盘子只能在3个标杆(A/B/C)之间移动,更大的盘子不能放在更小的盘子上面。

要求:输入汉诺塔的层数,输出整个移动过程。

img

当n = 2时:

image-20230926094910061

  1. 把小圆盘从A移动到B
  2. 把大圆盘从A移动到C
  3. 把小圆盘从B移动到C

扩展:当n个盘子时

image-20230926095129423

  1. 把n-1个圆盘从A经过C移动到B
  2. 把第n个圆盘移动到C (只有这一步是合法操作,一次只能移动一个盘子)
  3. 把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)
posted @   七落安歌  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示