1 递归是什么
递归(Recursion),指在函数的定义中使用函数自身的方法,即程序的自身调用。
递归的特征:有高度的自相似性,Eg.f(n)=nf(n-1)
递归的特点:
- 自身调用:原问题可以分解为子问题,子问题和原问题的求解方法是一致的,即都是调用自身的同一个函数。
- 终止条件:递归必须有一个终止的条件,即不能无限循环地调用本身。
递归的理解:递归可以分为“递”和“归”两个部分。“递”是将一个大问题划分成很多很多小问题,直到问题小到可以一步解决。”归“是将所有的小问题进行合并或者累加。
函数sum(n=5)的递归执行过程:
递归的应用场景:阶乘问题、二叉树深度、汉诺塔问题、斐波那契数列、快速排序、归并排序、遍历文件、解析xml文件
2 汉诺塔问题
问题背景
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
解决过程:
图源:百度图片。侵删。
因为盘子是大的在底端,不难看出我们首先需要把3号盘子移动到C,前提是1、2号盘子不在3号上方。
那我们就需要移动2号盘子,前提又是1号盘子不在2号上。
那第一步就是移动1号盘子。整个移动过程如下:
①1---->C, ②2---->B, ③1----->B ,④3----->C,⑤1------->A, ⑥ 2------->C, ⑦1------>C
可见①-④是一个“递”的过程(努力移动出最大的一块,将最大的一块放在C这是一个我们可以解决的问题),④-⑦是一个“归”的过程(按照大小顺序将每块都移动到C)
代码实现:
def move(n,a,b,c):
if n==1:
print(a,"->",c)
return
else:
move(n-1,a,c,b)
move(1,a,b,c)
move(n-1,b,a,c)