C语言递归实现汉诺塔问题

许多问题的求解过程都可以用递归分解方法描述,一个典型的例子是著名的汉诺(hanoi)塔问题。

1. 问题介绍

n 阶汉诺塔问题:假设有三个分别命名为 X、Y 和 Z 的塔座,再塔座 X 上有 n 个不同直径、编号为 1,2,...,n 的圆盘。现要求将塔座X上的 n 个圆盘移至塔座 Z 上,并仍按同样顺序叠排。

圆盘移动时必须遵循以下规则:

① 每次只能移动一个圆盘。

② 圆盘可以在 X、Y 和 Z 中的任何一个塔座上。

③ 任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。

【算法思想】

① 当 n=1 时,问题比较简单,只要将编号为 1 的圆盘从塔座 X 直接移动到塔座 Z 上即可;

② 当 n>1 时,需要用塔座 Y 做辅助塔座,若能设法将压在编号为 n 的圆盘上的 n-1 个圆盘从塔座 X(依照上述原则)移至塔座 Y 上,则可先将编号为 n 的圆盘从塔座 X 移至塔座 Z上,然后再将塔座 Y 上的 n-1 个圆盘(依照上述原则)移至塔座 Z 上。

2. 代码实现

下面是使用 C 语言实现汉诺塔问题的代码,同时统计总共移动了多少次。

c 复制代码
#include<stdio.h>

int count = 0;

void hanoi(int n, char from, char aux, char to) {
	if (n == 1) {
		printf("No.1 from %c to %c\n", from, to);
		count++;
		return;
	}

	hanoi(n - 1, from, to, aux);

	printf("No.%d from %c to %c\n", n, from, to);
	count++;

	hanoi(n - 1, aux, from, to);
}

int main() {
	int n = 0;
	scanf("%d", &n);
	hanoi(n, 'A', 'B', 'C');
	printf("%d\n", count);
	return 0;
}

第一步:移动上面 n-1 个盘子。

第二步:移动第 n 个盘子,即最大盘子。

第三步:再移动上面 n-1 个盘子。

3. 代码思路

c 复制代码
void hanoi(int n, char from, char aux, char to)
c 复制代码
hanoi(n, 'A', 'B', 'C');

把 n 个盘子从 A 柱子借助 B 柱子移动到 C 柱子。

4. 递归终止条件

c 复制代码
if (n == 1) {
    printf("No.1 from %c to %c\n", from, to);
    count++;
    return;
}

当只有一个盘子时,不需要再继续分解问题,直接把这个盘子从起始柱子移动到目标柱子即可。

这里的 return 非常重要。它表示当前函数执行结束,不再继续向下执行。如果没有这个 return,程序会继续调用:

c 复制代码
hanoi(n - 1, from, to, aux);

5. 代码分析

在汉诺塔问题中,每输出一次:

c 复制代码
printf("No.%d from %c to %c\n", n, from, to);

就表示真实移动了一次盘子。所以每打印一次移动步骤,就应该让移动次数加一:

c 复制代码
count++;

递归调用本身不是一次移动,而是"一组移动过程"。

6 汉诺塔的执行过程

总结

汉诺塔问题虽然代码不长,但非常适合理解递归中的三个关键点:递归函数的含义、递归终止条件,以及递归问题如何分解为更小规模的问题。

相关推荐
2601_962071576 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
淡海水7 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero7 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-8 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
黑马程序员毕设10 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
_Twink1e11 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
问天_观心11 小时前
大模型微调学习(一)
开发语言·人工智能·学习·语言模型·github
阿里嘎多学长11 小时前
2026-09-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
Navigator_Z11 小时前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
Navigator_Z12 小时前
LeetCode //C++ - 1226. The Dining Philosophers
c语言·算法·leetcode