如何理解递归
递归我们都知道是一种算法,但是我们在写递归的时候往往很难写出来,归根到底是因为我们在以计算机的思维去思考递归的实现,所以,更好的理解递归的方法在于放弃。
我们拿经典的汉诺塔问题来举个栗子:
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
现在我们开始思考最简单的情况:三个柱子上只有一个圆盘,那么很简单,直接a -> c
即可
def hanoi_tower(n, a, b, c):
if n == 1:
print(a + " -> " + c)
如果有两个圆盘呢?那也很简单,我们只需要a -> b
a -> c
b -> c
即可完成
那么如果有三个或者更多原盘呢?我们还要考虑每一步需要怎么去移动吗?答案肯定是不的。
所以这里重点在于我们需要放弃思考每一步的具体实现,转而交给函数本身去思考如何移动原盘,我们需要做的只有三步:
- 把冰箱门打开
a -> b : hanoi_tower(n - 1, a, c, b)
- 把大象放进去
a -> c : print(a + " -> " + c)
- 把冰箱门关上
b -> c : hanoi_tower(n - 1, b, a, c)
至于如何开门?如何关门?我们并不关心,我们需要做的只有递归两层之间的交接,以及递归终结的条件,其他的步骤交由另一个自己去实现,至于这另一个自己怎么去移动,我们不需要去思考
python实现代码:
def hanoi_tower(n, a, b, c):
if n == 1:
print(a + " -> " + c)
return
hanoi_tower(n - 1, a, c, b)
print(a + " -> " + c)
hanoi_tower(n - 1, b, a, c)
另外如果有兴趣可以阅读一下知乎的这篇文章,相信会让你有更深的理解。