数据结构(C语言)—— -1递归:汉诺(Hanoi)塔

C语言实现汉诺塔递归算法
本文介绍如何使用C语言实现汉诺塔的递归算法。通过理解递归划分和递归出口,详细解释了如何将n个盘子从一个柱子移动到另一个柱子,重点在于n=1时的特殊情况处理。

趁着复习把课上的作业和代码上传上来嘿嘿嘿,这个系列的代码都是自己写的或者老师教学用的可能内存管理上有点小瑕疵,但是算法理解还是不错的!本系列所有代码在dev-cpp上可以跑通~

汉诺塔:

一次只移动一片,不管在哪根针上,小片必须在大片上面,然后要把一个针上的移动到另一个,源代码如下:

#include<stdio.h>
int s=0;
void Hanoi(int n,char A,char B,char C){
	if(n==1){
		printf("step%d:move %d %c->%c\n",++s,1,A,C);
	}
	else{
		Hanoi(n-1,A,C,B);
		printf("step%d:move %d %c->%c\n",++s,n,A,C);
		Hanoi(n-1,B,A,C);
	}
}
int main(){
	Hanoi(4,'A','B','C');
	return 0;
}

下面我们一起来理解一下:

首先看1-2的移动方案(我们假设有A、B、C)三个柱子,一开始在A柱子,然后移动到C柱子

一个的时候,直接从A到C

两个的时候,先把第一个放到B,然后再把第二个放到C然后把B上的放到C

……

(知乎答主酱紫君做的动画)

一直列举下去会发现,其实就是先把n-1个放到B,然后再把第n个放到C,最后把n-1个从B放到C。

我们的hanoi(f1,f2,f3,f4)接收三个参数,表示把f1个东西从f2柱子移动到f4去,所以对应的代码为:

Hanoi(n-1,A,C,B);//n-1个从A移动到B
printf("step%d:move %d %c->%c\n",++s,n,A,C);//第n个移动到C
Hanoi(n-1,B,A,C);//把n-1个从B到C

这是我们的递归的划分,还要递归出口,我们知道出口是n==1的时候,这个时候直接把剩下的1个从A搬到C。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值