递归函数 - 汉罗塔的问题

递归函数的定义:

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

  • 例子1
    阶乘n! = 1 x 2 x 3 x … x n

python代码如下:

def fact(n):
    if n == 1:
        return 1
    else:
        return n*fact(n-1)   # 自己调用自己本身
print(fact(5))
输出结果:
120
  • 汉罗塔问题
    编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法

其实,我的思路是,将底下的n-1个盘子作为整体,其次递归函数move时,也就是说替换abc参数的位置,即轮流作为“中间的那个柱子”

def move(n,a,b,c):
    if n == 1:
        print(a,'-->', c)  # 当a柱中只有1个,直接转移到c柱上
    else:
        move(n-1,a,c,b)  # 借助c柱,将n-1个盘子转移到b柱子上
        print(a,'-->',c)   # 此时的c柱子充当为b柱子
        move(n-1,b,a,c)  # 借助a柱子,将b中的n-1个盘子转移到c柱子上
        # print(a,'-->',c)
move(3,'a','b','c')
输出结果:
a --> c
a --> b
c --> b
a --> c
b --> a
b --> c
a --> c
  • 汉罗塔解释
    (【注】在https://www.liaoxuefeng.com/wiki/1016959663602400/1017268131039072#0看到评论里的解释特别好,拿过来)
    首先,我们考虑n为1的情况,也即仅有A柱有一个圆盘的情况: 此时我们只需要做到将A柱上的圆盘移动到C柱上即可,我们用下面这条语句来表示这个过程,这就是我们的递归基础;
def move(n,a,b,c):
    if n == 1:
        print(a,'-->', c)  # 当a柱中只有1个,直接转移到c柱上

其次,我们来考虑n为2的情况,这个时候A柱上从上到下有一小一大两个圆盘,我们需要做的是先借助C柱,将小盘移动到B柱,然后就回到了n为1的情况了,这时我们只需要和之前一样,将A柱上的

圆盘移动到C柱上即可,移动的过程如下:

# n == 2
a -> b
a -> c
b -> c

下面,我们来思考n为3的情况,这个时候A柱上从上到下有小中大三个圆盘,从这个时候开始我们要引入抽象的概念,将小盘和中盘视作一个整体,我们现在所需要的是将这个整体借助C柱,移动到B柱上,然后我们就有一次回到了n为1的情况了,本次移动过程如下:

# n == 3
a --> c
a --> b
c --> b
a --> c
b --> a
b --> c
a --> c

如果我们继续用大脑(或手和笔)去跟踪函数运行每一步的执行,我们很难保证一步不错地跟下来。

汉诺塔(递归问题)的关键就在于放弃我们让大脑(或用手和笔)去跟踪函数运行每一步的执行的习惯,利用用抽象和自动化的思想解决问题。

事实上,我们总能将A柱最底层的圆盘上面的n-1个圆盘抽象为一个整体,然后借助C柱将其转移到B柱上,然后我们就回归到了n为1的情况了;
这时我们只需要和之前一样,将A柱上的一个圆盘移动到C柱上即可;

然后,对于此时在B柱上的n-1个圆盘,我们又可以将最底层的圆盘上面的n-2个圆盘抽象为一个整体,借助C柱将其移动到A柱;
然后将最底层的圆盘从B柱移动的C柱上,这个时候,那n-2个圆盘又可以继续如上操作;

综上所述,我们顺着这个思路,可以发现,我们总有办法将初始柱上的n-1个圆盘,借助目的柱而移动到中间柱上,进而我们就回到了最简单的n为1的情况。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值