问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言题目,关于河内之塔的问题。。。

发布网友 发布时间:2024-10-22 09:48

我来回答

4个回答

热心网友 时间:2024-11-08 13:56

hanoi函数没问题,功能是把n个盘子从A挪到C上去,把B当作中转的盘子。
感觉你好像理解错了,在main中调用时,应该用hanoi(n, 'A', 'B', 'C');
如果你还是不理解的话,建议把void hanoi(int n, char A, char B, char C)写成void hanoi(int n, char from, char buffer, char to)。
然后是你的问题没看懂。
“为什么n=2的时候结果是,
a to c
a to b
c to b”
这个就是你调用的正确结果啊,把2个盘子从A挪到B,把C当作中转。
“我看运行应该是先
(2,a,c,b)
调用(1,a,c,b)” //好像你这理解错了,第一次递归后两个参数交换位置
//下面的就不懂你在问什么了。
(move 1,a to b)
(1,b,a,c)
在调用n==1时的情况呀!
//不懂再追问追问怎么就:第一次递归后两个参数交换位置
不理解,怎么换位置的

追答#include
#include
//你要先理解汉诺塔的模型
//面前从左到右分别是A,B,C这3个位置
//我把你主函数改了,假设n个盘子在A,要全部挪到C去

//将n个盘子从“位置from”挪到“位置to”上
//需要的话,用中间的“位置buffer”中转
int hanoi(int n, char from, char buffer, char to) {
if(n == 1) {
//将1一个盘子从“位置from”挪到“位置to”,就可以直接挪动
printf("Move sheet %d from %c to %c\n", n, from, to);
//挪完了,本次递归就要返回上一层
return 0;
}
else {
//有n个盘子需要从“位置from”挪到“位置to”
//利用递归,将上面n-1个盘子,先挪到“位置buffer”
hanoi(n-1, from, to, buffer);

//上面的n-1个盘子已经都放到“位置buffer”
//所以将第n个盘子,直接挪到 “位置to”
printf("Move sheet %d from %c to %c\n", n, from, to);

//但是现在上面n-1个盘子还都在“位置buffer”
//需要把它们放到最终的位置上
hanoi(n-1, buffer, from, to);

//返回调用本函数的地方
return 0;
}
}
int main(int argc, char *argv[])
{
int n;
printf("input number of the plates:");
scanf("%d",&n);
while(n){
hanoi(n, 'A', 'B', 'C');
printf("请输入盤数:");
scanf("%d", &n);
}
system("PAUSE");
return 0;
}

热心网友 时间:2024-11-08 13:56

首先知道第一次调用时,就是hanoi(n, 'A', 'c', 'b'); 这里的函数hanoi(int n, char A, char B, char C)中的n=2,A='A',B='c',C='b'。这时进入执行的是else中的hanoi(n-1, A, C, B);这是第二次调用,这里的函数hanoi(int n, char A, char B, char C)中的n=1,A='A',B='b',C='c',这事进入执行的是if(n==1)语句输出1,a to c,然后跳出这次调用,执行下一个语句printf("Move sheet %d from %c to %c\n", n, A, C);
这里输出的是第一次调用时的2,A to b,然后调用hanoi(n-1,B, A, C);这是第三次调用,并且还是嵌在第一次调用的程序中,所以这里的函数hanoi(int n, char A, char B, char C)中的n=1,A='c',B='A',C='b'
这事进入执行的if(n==1)语句输出1,c to b。然后跳出第三次调用,最后跳出第一次调用追问朋友,谢谢你的解答,我还是不太清楚是:从开始 的A='A',B='c',C='b',变换到A='A',B='b',C='c',在变换到,A='c',B='A',C='b'
。。。。。这个比较的郁闷

热心网友 时间:2024-11-08 13:57

函数传参数问题
hanoi(int n, char A, char B, char C)
将'A','c','b'传递进去
开始的时候执行else中的 hanoi(n-1, A, C, B);
打印第一句
printf("Move sheet %d from %c to %c\n", n, A, C);
此时的A C 是上面的AB上面的AB又是最上面的 'A''c'
显然得到结果为
Move sheet 1 from A to c
Move sheet 2 from A to b
Move sheet 1 from c to b

建议将hanoi(n, 'A', 'c', 'b');
改为hanoi(n, 'A', 'B', 'C');好理解些

热心网友 时间:2024-11-08 13:57

看不懂
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 撇烈词语解释 撇烈的解释撇烈的解释是什么 索泰GTX460 2GB功能参数 茅台龙尊收藏酒 带大家来了解茅台龙尊酒的收藏价值 赶紧来看(茅台龙尊... 索泰GTX460-2GD5 首发版索泰GTX460-2GD5 首发版详细参数 脚趾甲黑怎么回事 你好 请问现在什么牌子的GTX460显卡最高或者哪个牌子的性价比最高?_百... GTX460 1G版 纯玩游戏用,什么牌子的好?公版还是非公版? GTX460的显卡哪个好? GTX460选公版的好还是非公版的具体那种牌子比较好? 贵州茅台的口感特点有哪些? 种的薄荷叶子上有银白色的小点和淡黄色的小点 请问是什么病 有什么解决... 四款显卡有什么不同差距哪个最好? 现在中关村还能买到GTX460 1G的显卡吗 比较标准无缩水的...大概多少... ...和她的关系也还不错,就是不和妈说话,我俩缺乏沟通。 ...很自责很自责,觉得这样不孝。但是好像就是改不了,成了条件反射_百度... 相比信泰人寿达尔文5号焕新版,阳光人寿i保长期重疾险优缺点是什么? 杭州振宁路坐地铁几号线到滨安路 ...4点40分,体重6.6斤。 父亲叫 刘阳 1985年2月13出生27岁 ...17.10点26分生阳历,6.6斤父姓陈,母刘,帮忙起下名字,谢谢_百度... c++河内塔问题 怎样设计一个C语言程序实现20个盘子的汗诺塔问题,包括打印出运算步骤... 关于c++程序中有名的河内塔问题 有试过输入n=50 的么? 可以告诉一下算... 情绪价值在人们的生活中扮演什么样的角色呢? 情绪价值在我们的生活中扮演着什么角色? 一起来捉妖怎么拥有一只满资质妖灵 一起来捉妖满资质妖灵怎么得 满资质妖灵获取攻略-高手进阶-安族网... ...不管我,我算是我亲戚照顾大的,因为我不喜欢老家的生活,所以我努力... ...连接电脑连接手机视频吗(笔记本电脑如何连接蓝牙耳机视频) 什么是货币汇率 川菜的代表作是什么 川菜的代表作 川菜代表作是什么 关于交叉汇率的题!请帮助解答,谢谢!!! ...然后不要了。申请退款。可是跟踪记录已经写着退货已签收。可是钱就... 那霍镇乡镇概况 ...上是过了两天才来取件的. 在快递显示取件前申请的退 那霍镇地理位置 在微店上买件 衣服,已经发出来了。然后不要了。申请退款。可是跟踪记录... 索泰GTX460-1GD5 首发版重要参数