递归与汉诺塔问题

术语

递归函数

该函数在内部调用了自己。

基线条件

当满足基线条件时,函数不再继续调用自己。

递归条件

当满足递归条件时,函数调用自己。

递归实现的阶乘

def factorial(x):
    if x == 1:
        # 满足基线条件,停止继续调用函数自身
        return 1
    else:
        # 满足递归条件,继续调用函数自身
        return x * factorial(x - 1)

汉诺塔问题

汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?[此段与下面的图片摘自汉诺塔问题]

解决思路

先将a柱上的其余圆盘搬到b上(如下图),然后就可以把a上的最下面一块搬到c上了,再重复上述步骤,将b柱上除下面一块搬到a柱上,再将b柱上最后一块搬到c上。。如此继续,就可以将a柱上的全部圆盘搬到c上了。

Python实现

def hanoi(n, a, b, c):
    if n == 1:
        # 如果只有一个圆盘,可以直接移动
        move(n, a, c)
    else:
        # 将柱a上的最上面n-1块圆盘以柱c为辅助柱移动到柱b上
        hanoi(n - 1, a, c, b)
        # 将柱a上的最后一块圆盘搬到柱c
        move(n, a, c)
        # 将柱b上的最上面n-1块圆盘以柱a为辅助柱移动到柱c上
        hanoi(n - 1, b, a, c)


def move(n, src, target):
    print("将圆盘%s从柱%s搬到柱%s" % (n, src, target))


if __name__ == '__main__':
    hanoi(3, 'a', 'b', 'c')

将圆盘1从柱a搬到柱c
将圆盘2从柱a搬到柱b
将圆盘1从柱c搬到柱b
将圆盘3从柱a搬到柱c
将圆盘1从柱b搬到柱a
将圆盘2从柱b搬到柱c
将圆盘1从柱a搬到柱c

Process finished with exit code 0

原文地址:https://www.cnblogs.com/focksor/p/12680670.html