如何理解递归

如何理解递归

递归我们都知道是一种算法,但是我们在写递归的时候往往很难写出来,归根到底是因为我们在以计算机的思维去思考递归的实现,所以,更好的理解递归的方法在于放弃。

我们拿经典的汉诺塔问题来举个栗子:

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着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)

另外如果有兴趣可以阅读一下知乎的这篇文章,相信会让你有更深的理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值