函数递归 - 汉诺塔(C语言实现)

文章目录

  • 1. 问题背景
  • 2. 思路:
  • 3. 具体实现


1. 问题背景

有三个柱子,每个柱子都可以放圆盘。
从左向右依次起名A柱子、B柱子、C柱子。
现在A柱子有n个大小从下往上依次减小的圆盘,每次可以移动一个盘子,
且大盘不能在小盘上面,最终这n个盘子均移动到C柱子上请输出n个盘子的移动的过程。


2. 思路:

有1个盘子时: 2^1 - 1次 A->C


函数递归 - 汉诺塔(C语言实现)_第1张图片

有2个盘子时: 2^2 - 1次 A->B A->C C->B

函数递归 - 汉诺塔(C语言实现)_第2张图片

有3个盘子时: 2^3 - 1次 A->C A->B C->B A->C B->A B->C A->C


3个盘子的简单模拟:
函数递归 - 汉诺塔(C语言实现)_第3张图片


函数递归 - 汉诺塔(C语言实现)_第4张图片


采用递归思想:

  • 初始柱子、目标柱子、中间柱子是相对具体的盘子而言的,但最终所有的盘子均要按规则移动到C盘之上。

求n个盘子过程,先把初始柱子上除最底下的盘子之外的n-1个盘子看做一个整体,

1.类似于初始住上只有2个盘子的情况。
对于上面的n-1个盘子看成的总体需要先移动到B柱子上,以便于最底下的(最大的)
那1个盘子移动到C柱子上。
故B柱子此时是目标柱子,C柱子是中间柱子。从初始柱子A经过中间柱子C移动到
目标柱子B。

2.对于下面的这1个盘子需要移动到C柱子上。
故C柱子此时是目标柱子,B柱子是中间柱子。看做从初始柱子A不经过中间柱子B
直接移动到目标柱子C。

3.对于n-1个盘子组成的总体,此时这个总体在B柱子上。
故B柱子是这个总体的初始柱子,这个总体最终需要移动到C柱子上,故C柱子此时便是目标柱子,而A柱子是中间柱子。
看做从初始柱子B经过中间柱子A移动到目标柱子C。


3. 具体实现

#include 

void print(char pos1, char pos2);
void Hanoi(int n, char pos1, char pos2, char pos3);

int main() {
	int n = 0;
	scanf("%d", &n);

	Hanoi(n, 'A', 'B', 'C');
	return 0;
}
//从pos1柱子移动到pos2柱子
void print(char pos1, char pos2) {
	printf("%c->%c ", pos1, pos2);
}
//
//pos1所在的位置放初始柱子
//pos2所在的位置放中间柱子
//pos3所在的位置放目标柱子
void Hanoi(int n, char pos1, char pos2, char pos3) {
	if (n == 1) {
		print(pos1, pos3);
	}
	else {
		Hanoi(n - 1, pos1, pos3, pos2);
		print(pos1, pos3);
		Hanoi(n - 1, pos2, pos1, pos3);
	}
}

一个运行结果
运行结果.png
点个赞再走呗!

END

你可能感兴趣的:(C语言学习之路,c语言)