递归解法:汉诺塔问题(Hanoi)

问题描述:

有A、B、C三根细柱子,其中A柱子上从上到下堆放着n个由小到大的环形盘子,将A柱子上的盘子移动到C柱子上,以B柱子为中转站,且移动过程中大盘子不能放在小盘子上(在B柱子从上到下也要遵循也要由小到大的摆放)。

分析

【以三个盘子为例】实现效果如下图所示

递归解法:汉诺塔问题(Hanoi)_第1张图片

将盘子进行编号,移动顺序为

第一次:盘1从A移到C

第二次:盘2从A移到B

第三次:盘1从C移到B

第四次:盘3从A移到C

第五次:盘1从B移到A

第六次:盘2从B移到C

第七次:盘1从A移到C

过程如下图所示

递归解法:汉诺塔问题(Hanoi)_第2张图片

 递归解法:汉诺塔问题(Hanoi)_第3张图片

 编程思路

       (1) 最简单的就就是只有一个盘子:

                        n==1,直接从A盘移动到C盘(这个就是基线条件)

        (2)n大于等于2,将A柱上的n-1个移到B柱上,只留下第n个,然后再将B柱上的n-2个移到A柱上,留下第n-1个……使用n-1调用自己(递归条件)

       

C语言代码

//汉诺塔问题(Hanoi)
#include
#include
void Hanoi(int n,char a,char b,char c)
{
	if (n==1)
		printf("将编号为%d的盘子从%c移到%c\n",n,a,c);
	else
	{
		Hanoi(n-1,a,c,b);
		printf("将编号为%d的盘子从%c移到%c\n",n,a,c);
		Hanoi(n-1,b,a,c);
	}
}


int main()
{
	int n;
	printf("请输入要移动盘子的个数:");
    scanf("%d", &n);
    Hanoi(n,'A','B','C');
	system("pause");
}

代码解释

同样以三个盘子为例,解释自定义函数Hanoi函数的运算过程

(1)首先输入移动的盘子个数:3

(2)使用Hanoi函数:Hanoi(n,'A','B','C');——意思是将三个盘子从A柱移动到C柱,中转柱为B柱

(3)n不等于1,执行语句

        Hanoi(n-1,a,c,b);
        printf("将编号为%d的盘子从%c移到%c\n",n,a,c);
        Hanoi(n-1,b,a,c);

递归解法:汉诺塔问题(Hanoi)_第4张图片

         图中的ABC均为实际柱子的编号,是实际意义,不是规范的代码。

你可能感兴趣的:(C语言,c语言)