Python自学-递归函数之汉诺塔问题

递归函数之汉诺塔问题

  • 规则(A B C 三个塔,盘子都在 A,最后盘子都放到 C)
    • 1.每次移动一个盘子
    • 2.任何时候大盘子在下面,小盘子在上面
  • 方法:
    • 1.n = 1:直接把A上的一个盘子移动到C上,A -> C
    • 2.n = 2:
      • 1). A -> B
      • 2). A -> C
      • 3). B -> C
    • 3.n = 3:
      • 1). 把 A 上的两个盘子,通过 C 移动到 B 上,调用递归实现
      • 2). 把 A 剩下的最大盘子移动到 C,A -> C
      • 3). 把 B 上的两个盘子,通过 A 移动到 C 上,调用递归实现
    • 4.n = n:
      • 1). 把 A 上的 n-1 个盘子,通过 C 移动到 B 上,调用递归实现
      • 2). 把 A 剩下的最大盘子移动到 C,A -> C
      • 3). 把 B 上的 n-1 个盘子,通过 A 移动到 C 上,调用递归实现
# 汉诺塔问题实现步骤代码
def hano(n,A,B,C):
    '''
    汉诺塔的递归实现
    n:代表几个盘子
    A:代表第一个盘子,开始的盘子
    B:代表第二个盘子,过渡的盘子
    C:代表第三个盘子,最后的盘子
    '''
    if n == 1:
        print(A,"-->>",C)
        return None
    # n = 2 这段 if 代码实际可以省去不写
    if n == 2:
        print(A,"-->>",B)
        print(A,"-->>",C)
        print(B,"-->>",C)
        return None
        
    # 当 n > 2 时,通过以下三个大步骤实现:
    
    # 1)把 n-1 个盘子,从 A 借助于 C 移动到 B,递归调用,注意参数位置变化
    hano(n-1,A,C,B)
    
    # 2)把 A 剩下的最大盘子移动到 C
    print(A,"-->>",C)
    
    # 3)把 n-1 个盘子,从 B 借助于 A 移动到 C,递归调用,注意参数位置变化
    hano(n-1,B,A,C)
    
A = "A"
B = "B"
C = "C"

# 调用 input 函数输入需要移动的盘子数量,并使用 int 转化为整数
n = int(input(">>>请输入汉诺塔初始盘子数量:"))
hano(n,A,B,C)

你可能感兴趣的:(Python自学,python,汉诺塔,递归函数)