数据结构中的递归
递归
递归的两个特点:
- 调用自身(即规律不变)
- 可结束(即有结束条件)
递归重点需要从过程进行分析。
递归实例:汉诺塔问题
问题描述:
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移 动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
仔细分析,不能发现其有步骤规律可寻
当有 n n n个盘子时:
- 把 n − 1 n-1 n−1 个圆盘从 A A A 经过 C C C 移动到 B B B
- 把第 n n n 个圆盘从 A A A 移动到 C C C
- 把 n − 1 n-1 n−1 个小圆盘从 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 n−1个盘子移动到 B B B后,才能将第 n n n个盘子移动到 C C C,这是必要条件!(第 n n n个盘子是最大的,其不允许下面有比它小的盘子,那么它下面必定没有盘子,那其余的盘子肯定是在 B B B,而且其余盘子排列也必须是自下而上、由大到小)同理,你想将第 n − 1 n-1 n−1个盘子从B移动到 C C C的话,先得将其上面的 n − 2 n-2 n−2个盘子移动到 A A A,再将第 n − 1 n-1 n−1个盘子从B移动到 C C C。往复循环,一直到第一个盘子移动到 C C C为止。