数据结构中的递归

数据结构中的递归

递归

递归的两个特点:

  1. 调用自身(即规律不变)
  2. 可结束(即有结束条件)

递归重点需要从过程进行分析。

递归实例:汉诺塔问题

问题描述:

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移 动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
在这里插入图片描述

仔细分析,不能发现其有步骤规律可寻

当有 n n n个盘子时:

  1. n − 1 n-1 n1 个圆盘从 A A A 经过 C C C 移动到 B B B
  2. 把第 n n n 个圆盘从 A A A 移动到 C C C
  3. n − 1 n-1 n1 个小圆盘从 B B B经过 A A A移动到 C C C

我们写程序来模拟其移动的过程:

"""
    n:盘子的总数
    a:表示从哪个盘子
    b:表示经过哪个盘子
    c:表示到哪个盘子
"""
def hanoi(n,a,b,c):
	if n>0 :
		hanoi(n-1,a,c,b)                   # 1.将n-1个盘子从a经过c移动到b
		print("将盘子从%s移动到%s" % (a,c)) # 2.将第n个盘子从a移动到c
		hanoi(n-1,b,a,c)                   # 3.将n-1个盘子从b经过a移动到c

hanoi(3,'A','B','C')

输出结果:

将盘子从A移动到C
将盘子从A移动到B
将盘子从C移动到B
将盘子从A移动到C
将盘子从B移动到A
将盘子从B移动到C
将盘子从A移动到C

如何理解?

其实问题的本质是将 n n n个盘子从 A A A移动到 C C C,但是如果你想将 n n n个盘子移动到 C C C的话,你得先将第 n n n个盘子上面的 n − 1 n-1 n1个盘子移动到 B B B后,才能将 n n n个盘子移动到 C C C,这是必要条件!( n n n个盘子是最大的,其不允许下面有比它小的盘子,那么它下面必定没有盘子,那其余的盘子肯定是在 B B B,而且其余盘子排列也必须是自下而上、由大到小)同理,你想将 n − 1 n-1 n1个盘子从B移动到 C C C的话,先得将其上面的 n − 2 n-2 n2个盘子移动到 A A A,再将 n − 1 n-1 n1个盘子从B移动到 C C C。往复循环,一直到第一个盘子移动到 C C C为止。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuZou 邹宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值