C语言实现递归经典 汉诺塔超详解

问题描述

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

解题思路

首先对问题进行分析
我们知道要将一根柱子的圆盘移动到另一个柱子上 我们需要移动 2^64.但是不易人为确定每一步如何移动
因此我们需要将问题进行简化处理

1

要将64个圆盘从柱一移动到柱三
我们需要将上面63个圆盘首先移动到柱二
再将最下面圆盘的从柱一移动到柱三

2

要将上面63个圆盘移动到柱三
我们需要将上面62个圆盘首先移动到柱二
再将倒数第二个圆盘从柱一移动到柱三

我们只需要重复上面的步骤 层层往下

3

将上述过程分成两步
第一步:将n-1个盘子从一个柱子移动到另一个柱子(n>1)
第二部:讲一个盘子从一个柱子移动到另一个柱子

编写程序

#include
#include
//汉诺塔

void move(char x, char y)
{   //移动打印函数
	printf("%c-->%c\n", x, y);
}

void hanoi(int n, char a, char b, char c)
{
	void move(char x, char y);
	if (n == 1)                         //只剩一层 直接进行移动 a》》》c
	{
		move(a, c);
	}
	else
	{
		hanoi(n - 1, a, c, b);     //对除去下面一层进行汉诺塔操作 将a其他的移动到b上 借助c  
		move(a, c);                //进行最后一层 直接a》》》》c
		hanoi(n - 1, b, a, c);     //目前最多的在b上 需要借助a移动到c上面
	}
}
int main()
{
	int n = 0;
	scanf_s("%d", &n);
	hanoi(n, 'a', 'b', 'c');
	system("pause");
	return 0;
}

原创文章 zy

你可能感兴趣的:(汉诺塔,递归,C语言)