汉诺塔以C为中转 把n-1个盘子从a移到b 不是很理解函数怎么会实现的?

yilonglucky
2011-09-05 · TA获得超过748个赞
知道小有建树答主
回答量:104
采纳率:0%
帮助的人:75万
展开全部
/*利用算法设计中的分治思想,一个复杂的问题不好解决,将它转化为相同类型复杂性更小的问题即可,“分而治之”。
将n个盘子挪从挪到c不好挪,就将上面n-1个挪到b,第n个就可以直接挪到c了。
同理,将n-1个盘子挪到b不好挪,就将上面n-2个挪到c,层层将问题交给“别人”去做(其实就是利用递归),等到就剩下最上面的1个盘子的时候,那个函数就可以直接挪了。
*/
#include <stdlib.h>
/*
Name:HANOI TOWER
Copyright:
Author:yilonglucky
Date: 01-08-11 09:50
Description:realise the hanoi tower problem by recursion
some parse have been shown
*/

//move n plates: from --> to
//the buffer can be used, if needed
int hanoi(int n, char from, char buffer, char to) {
if(n == 1) {
//move the NO.1 plate directly: from --> to
printf("Move sheet %d from %c to %c\n", n, from, to);
//the NO.1 plate is moved & return
return 0;
}
else {
//n plates to be moved: from --> to
//move the n-1 plates above: from --> buffer
//give this task to the next recursion
hanoi(n-1, from, to, buffer);

//the n-1 plates above were move to buffer
//so the NO.n plate can be moved directly
printf("Move sheet %d from %c to %c\n", n, from, to);

//however the n-1 plates are still in buffer
//move them to the terminal position
//(the "from" position has no plate, & can be one so-called buffer)
hanoi(n-1, buffer, from, to);

//the task given is done & return
return 0;
}
}
int main(int argc, char *argv[])
{
int n;
printf("input number of the plates:");
scanf("%d",&n); //end only if 0 is inputed
while(n){
hanoi(n, 'A', 'B', 'C');
printf("input number of the plates:");
scanf("%d", &n);
}
system("PAUSE");
return 0;
}
追问
你说递归 第一步 以c为中转 把n-1个盘子a移动到b
我不太理解 以c为中转这句话,是与中间的这句话的pintf("%d:a-->c"n,a,c); 的打印a-->c有关系吗?
追答
首先你要确认问题,从哪到哪。
假如有64个盘子,从小到大编号。64号盘子最大在最下面,要从A搬到C。上面有63个盘子,所以64号盘子不能直接挪,要先把上面63个盘子从A挪到B(B就是中转),之后,64号盘子可以直接从A挪到C。
现在问题被简化了,63个盘子要从B挪到C,与上面同理。
递归就是为了解决同种类型,规模不同的问题,理解好这8个字,你就明白递归了
万泰东科
2024-11-14 广告
无尘室拖链、防静电拖链、POWER BASE同步升降器、RACK JACK、Accura功率模块、ROOTECH功率表等选择万泰东科,详情咨询:022-83946920。天津万泰东科自动化设备有限公司从事工业自动化部品的销售和技术服务等业务... 点击进入详情页
本回答由万泰东科提供
百度网友2c32892
2011-09-05 · TA获得超过1554个赞
知道小有建树答主
回答量:704
采纳率:0%
帮助的人:335万
展开全部
解汉诺塔的思想是递归
把n-1个盘子从a移到b,可以先把n-2个盘子移到c,再将a最下面的盘子移到b,再将c的n-2个盘子移到b,以此类推

如果是编程的话可以写一个递归函数。但这个函数只是用来练算法和编程的,没什么实际意义
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式