C语言汉诺塔问题详解:代码逐行解释及思路分析
思路: 将汉诺塔问题分解为三个子问题:
- 将n-1个盘子从A经过C移动到B;
- 将第n个盘子从A移动到C;
- 将n-1个盘子从B经过A移动到C。
代码解释:
#include <stdio.h>
// 定义移动函数,参数为盘子个数n、起始柱子from、辅助柱子aux、目标柱子to
void move(int n, char from, char aux, char to) {
// 当只有一个盘子时,直接将盘子从起始柱子移动到目标柱子
if (n == 1) {
printf('Move disk 1 from %c to %c\n', from, to);
return;
}
// 递归调用move函数,将n-1个盘子从起始柱子经过目标柱子移动到辅助柱子
move(n - 1, from, to, aux);
// 将第n个盘子从起始柱子移动到目标柱子
printf('Move disk %d from %c to %c\n', n, from, to);
// 递归调用move函数,将n-1个盘子从辅助柱子经过起始柱子移动到目标柱子
move(n - 1, aux, from, to);
}
int main() {
int n;
printf('Enter the number of disks: ');
scanf('%d', &n);
printf('Steps to solve the Tower of Hanoi problem:\n');
move(n, 'A', 'B', 'C');
return 0;
}
代码逐行解释:
#include <stdio.h>:包含输入输出函数的标准库头文件。void move(int n, char from, char aux, char to) {:定义一个名为move的函数,参数为盘子个数n、起始柱子from、辅助柱子aux、目标柱子to。if (n == 1) {:判断当只有一个盘子时,执行下面的代码块。printf('Move disk 1 from %c to %c\n', from, to);:打印移动盘子的步骤,输出起始柱子和目标柱子的名称。return;:结束函数的执行。move(n - 1, from, to, aux);:递归调用move函数,将n-1个盘子从起始柱子经过目标柱子移动到辅助柱子。printf('Move disk %d from %c to %c\n', n, from, to);:打印移动盘子的步骤,输出起始柱子和目标柱子的名称。move(n - 1, aux, from, to);:递归调用move函数,将n-1个盘子从辅助柱子经过起始柱子移动到目标柱子。int main() {:程序的主函数。int n;:定义一个变量n,用于存储盘子的个数。printf('Enter the number of disks: ');:打印提示信息,要求输入盘子的个数。scanf('%d', &n);:从标准输入读取盘子的个数,并赋值给变量n。printf('Steps to solve the Tower of Hanoi problem:\n');:打印提示信息,用于展示解决汉诺塔问题的步骤。move(n, 'A', 'B', 'C');:调用move函数,传入盘子个数n和三个柱子的名称。return 0;:程序正常结束。
原文地址: https://www.cveoy.top/t/topic/fvAg 著作权归作者所有。请勿转载和采集!