汉诺塔问题的非递归实现及其思考
文章目录
有关问题的递归实现和非递归实现其实是我们理解计算机,或者说编程语言中关于函数调用的方式最好的方式之一,它让我们知道了某种编程语言在实现函数调用的方式,也是计算机进程切换的一种思想的体现。
我们先来说说汉诺塔问题:
汉诺塔问题是一个经典的问题。
汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
递归实现
我们先来看看汉诺塔问题的递归解决思路:
- 将 a 上的 n-1 个盘子通过以 c 为辅助移动到 b
- 将 a 上剩余的最大的盘子直接移动到 c
- 将 b 上的 n-1 个盘子通过 a 为辅助移动到 c
这其实是我们说过无数次的递归思路,代码实现很简单:
// 递归实现汉诺塔
// n 为汉诺塔圆盘编号,从小到大为 1,2,3,……
void hanoi(int n, char A, char B, char C) {
if(n == 1) {
printf("%c -> %c\n", A, C); // 如果只有一个盘子,从 A 直接移动到 C
}else {
hanoi