标题:[求助] "汉诺塔问题“求解
取消只看楼主
eagleboycn
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-9-26
结帖率:100%
 问题点数:0 回复次数:6 
[求助] "汉诺塔问题“求解

在书上看到的: “汉诺塔问题”:
在寺庙的一根柱子上,从上到下,依次从小到大叠放着N个碟子,现在要将这些碟子移动到另外一根柱子上面去,但是一次只能移动一个碟子,且碟子不能把大的叠放在小的上面。除了原来叠放碟子的柱子A,要移碟子过去的目标柱子B,还有一个可以作中转的柱子C,求移动次序?
书上讲解了一点,说是用 递归,但我不明白具体的操作,逻辑关系?
希望各位高手能帮忙讲解一下,不胜感激!

搜索更多相关主题的帖子: 汉诺塔 碟子 柱子 求解 叠放 
2007-10-22 07:47
eagleboycn
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-9-26
得分:0 
以下是引用六道在2007-10-22 15:29:07的发言:

#include <stdio.h>
void move(char x,char y)
{
printf("%c-->%c\n",x,y);
}
void hanoi(int n,char one,char two,char three)
{
if(n==1) move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}

main()
{
int m;
printf("input the unmber of diskes:");
scanf("%d",&m);
printf("the step to moving %3d diskes:\n",m);
hanoi(m,'A','B','C');
}

Thank you so much!


兵法的精要在于韬晦自己
2007-10-22 17:18
eagleboycn
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-9-26
得分:0 
以下是引用六道在2007-10-22 15:29:07的发言:
if(n==1) move(one,three);
else
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);

谢谢!
现在我明白这个递归序列了


兵法的精要在于韬晦自己
2007-10-22 17:24
eagleboycn
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-9-26
得分:0 

我把它改成C++的了:
#include <iostream>
using namespace std;
void move(char x,char y)
{
cout<<x<<"-->"<<y<<endl;
}
void hanoi(int n,char one,char two,char three)
{
if(n==1) move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}

int main()
{
int N;
cout<<"input the unmber of diskes:"<<endl;
cin>>N;
cout<<"the step to moving "<<N<<" diskes:"<<endl;
hanoi(N,'A','B','C');
return 0;
}


兵法的精要在于韬晦自己
2007-10-22 17:33
eagleboycn
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-9-26
得分:0 
当时看书上的碟子数量N是64,认为很复杂,头都大了
看来,结果是结果
我要了解的只是推理过程,递归序列
当时虽然看了书上的递归介绍,但是不理解
现在终于明白了

兵法的精要在于韬晦自己
2007-10-22 17:37
eagleboycn
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-9-26
得分:0 
以下是引用aipb2007在2007-10-22 19:14:26的发言:
N=64用递归是不可能计算出来的

何解?
为什么?
能说明原因吗?
谢谢了


兵法的精要在于韬晦自己
2007-10-23 07:31
eagleboycn
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-9-26
得分:0 
以下是引用aipb2007在2007-10-23 10:34:07的发言:
你算算 2^64-1

就算有无限大的内存使用,时间也不够啊!

也就是说理论上有结果
但是结果会接近无限长?
我用64运行过,等了1分多钟,看还在算,就没等了


兵法的精要在于韬晦自己
2007-10-23 16:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-179678-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.953778 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved