汉诺塔(递归函数)

题目:请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法

在看到廖雪峰老师python-递归函数教程下面一个大佬的解释后,觉得非常适合我这种小白,故在此记录

  • 首先关于汉诺塔:

有三根杆子A,B,C。A杆上有 N 个 (N>1) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆:

  1. 每次只能移动一个圆盘;
  2. 大盘不能叠在小盘上面

如图,N=3

  • 其次附上大佬代码:
# -*- coding: utf-8 -*-
def hanoi(n, a, b, c):

    # 当n为1时 (递归基础)
    if n == 1:
        print(a, '-->', c) # 将A柱最底层的圆盘移动到C柱

    # 当n大于1时
    else:
        hanoi(n-1, a, c, b) # 借助C柱,将n-1个圆盘从A柱移动到B柱
        print(a, '-->', c) # 将A柱最底层的圆盘移动到C柱
        hanoi(n-1, b, a, c) # 借助A柱,将n-1个圆盘从B柱移动到C柱

#调用hanoi函数,这里设置了n为5的情况
hanoi(10, 'a', 'b', 'c')
  • 最后步骤解释:
  1. n=1,即仅A柱上有一个圆盘时: 只需将A柱上圆盘移到C柱上即可,用下述语句表示该过程
    # n == 1
    print(a, '-->', c) 
    这也是本题的递归基础
  2. n=2,此时A柱上从上到下有一小一大两个圆盘,我们需要做的是先借助C柱,将小盘移动到B柱,然后就回到了n为1的情况了,移动的过程如下:
    # n == 2
    a -> b
    a -> c
    b -> c

     

  3. n=3,此时A柱上从上到下有小中大三个圆盘,为了便于理解引入抽象的概念,将小盘和中盘视作一个整体,将这个整体借助C柱,移动到B柱上,然后就又一次回到了n为1的情况了,本次移动过程如下:
    # n == 3
    a --> c
    a --> b
    c --> b
    a --> c
    b --> a
    b --> c
    a --> c

     

  4. 以此类推,总能将A柱最底层的圆盘上面的n-1个圆盘抽象为一个整体,然后借助C柱将其转移到B柱上,然后就回归到了n=1的情况了,这时只需要和之前一样,将A柱上的一个圆盘移动到C柱上即可;然后,对于此时在B柱上的n-1个圆盘,又可以将最底层的圆盘上面的n-2个圆盘抽象为一个整体,借助C柱将其移动到A柱,然后将最底层的圆盘从B柱移动的C柱上,此时,那n-2个圆盘又可以继续如上操作;顺着这个思路,可以发现,总有办法将初始柱上的n-1个圆盘,借助目的柱而移动到中间柱上,进而就回到了最简单的n为1的情况。

你可能感兴趣的:(廖雪峰python习题集)