
计算机数据结构的一道题: 汉诺塔问题:前提是只有3个金盘,麻烦给详细解释一下这段代码:
voidhanoi(intn,charone,chartwo,charthree){voidmove(charx,chary);if(n==1)move(one,thre...
void hanoi(int n,char one,char two,char three)
{
void move(char x,char y);
if(n==1)
move (one,three);
else
{hanoi(n-1,one,three,two);/这句是什么意思呢/
move(one,three);
hanoi(n-1,two,one,three);/这句是什么意思呢/
}
} 展开
{
void move(char x,char y);
if(n==1)
move (one,three);
else
{hanoi(n-1,one,three,two);/这句是什么意思呢/
move(one,three);
hanoi(n-1,two,one,three);/这句是什么意思呢/
}
} 展开
3个回答
展开全部
我和你一样,对汉诺塔一直搞不懂,但是有天上课,狠下心,安静的想想,然后自己代入数字去算,终于搞懂了...那就按3个金盘分析吧。
在one塔上,有三个盘,假设它是从大到小排列的(最下面的盘最大),并把盘移至three塔上,在这里,two塔是作为一个辅助塔的作用。
首先解释形参与实参:当n=2时,执行else hanoi(n-1,one,three,two);这句语句是调用函数自身,至于为什么顺序是one,three,two,是因为原理中要把除最后一个盘全部移至two盘中,而hanoi(n-1,one,three,two);在这句语句中,one,three,two是实参,但是在主函数体中void hanoi(int n,char one,char two,char three)声明的是形参,所以,在下面if(n==1) move (one,three);其实就相当if(n==1) move (one,two);即将one塔的第一个盘移至two塔!这样也就符合原理了!
好,基本原理已经明白了,下面开始程序执行步骤,我把程序运行时执行的语句一句一句写出来解释,刚试着解释n=3的情况,但是当n=3时,有18个步骤,越解释你会越糊涂的,所以建议解释n=2哈,其实知道n=2,自己想着3的执行步骤一步一步来就会了:
void hanoi(int 2,char one,char two,char three)//主函数
{
void move(char x,char y);
if(n==1) //判断n,n=2,所以执行else
else
hanoi(2-1,one,three,two); //这个语句即调用自身,所以要从头部看下来,但是注意传递的实参,为了方便区分,该函数为函数1
//现在开始执行函数1
if(n==1) //此时n=1,所以不执行else
move (one,three); //将第一个盘移至two塔,为什么是two呢,因为前面调用自身的时候,顺序是one,three,two,实际上此时three是指向two的。
//函数1执行完毕,继续执行主函数,即move(one,three);
move(one,three); //将第二盘移至three,此时是主函数,所以three指的就是three
hanoi(n-1,two,one,three);这个语句即调用自身,该函数为函数2
//现在开始执行函数2
if(n==1) //此时n=1,所以不执行else
move (one,three); //将第二个盘移从two塔移至three,为什么呢,因为前面调用自身的时候,顺序是two,one,three,实际上此时one是指向two的,three依然是指向three的。
//函数2执行完毕
//主函数也执行完毕
所以移动的顺序是,将1盘移至two塔,然后将2盘移至three塔,最后将
1盘,从two塔移至three。完成!
其实,仔细分析一下,n=3就出来了,关键在于要相信自己,一步一步来,注意区分实参和形参!
你一定可以的,要是还是没明白可以HI我!望采纳...写了很久~
在one塔上,有三个盘,假设它是从大到小排列的(最下面的盘最大),并把盘移至three塔上,在这里,two塔是作为一个辅助塔的作用。
首先解释形参与实参:当n=2时,执行else hanoi(n-1,one,three,two);这句语句是调用函数自身,至于为什么顺序是one,three,two,是因为原理中要把除最后一个盘全部移至two盘中,而hanoi(n-1,one,three,two);在这句语句中,one,three,two是实参,但是在主函数体中void hanoi(int n,char one,char two,char three)声明的是形参,所以,在下面if(n==1) move (one,three);其实就相当if(n==1) move (one,two);即将one塔的第一个盘移至two塔!这样也就符合原理了!
好,基本原理已经明白了,下面开始程序执行步骤,我把程序运行时执行的语句一句一句写出来解释,刚试着解释n=3的情况,但是当n=3时,有18个步骤,越解释你会越糊涂的,所以建议解释n=2哈,其实知道n=2,自己想着3的执行步骤一步一步来就会了:
void hanoi(int 2,char one,char two,char three)//主函数
{
void move(char x,char y);
if(n==1) //判断n,n=2,所以执行else
else
hanoi(2-1,one,three,two); //这个语句即调用自身,所以要从头部看下来,但是注意传递的实参,为了方便区分,该函数为函数1
//现在开始执行函数1
if(n==1) //此时n=1,所以不执行else
move (one,three); //将第一个盘移至two塔,为什么是two呢,因为前面调用自身的时候,顺序是one,three,two,实际上此时three是指向two的。
//函数1执行完毕,继续执行主函数,即move(one,three);
move(one,three); //将第二盘移至three,此时是主函数,所以three指的就是three
hanoi(n-1,two,one,three);这个语句即调用自身,该函数为函数2
//现在开始执行函数2
if(n==1) //此时n=1,所以不执行else
move (one,three); //将第二个盘移从two塔移至three,为什么呢,因为前面调用自身的时候,顺序是two,one,three,实际上此时one是指向two的,three依然是指向three的。
//函数2执行完毕
//主函数也执行完毕
所以移动的顺序是,将1盘移至two塔,然后将2盘移至three塔,最后将
1盘,从two塔移至three。完成!
其实,仔细分析一下,n=3就出来了,关键在于要相信自己,一步一步来,注意区分实参和形参!
你一定可以的,要是还是没明白可以HI我!望采纳...写了很久~

2025-07-02 广告
是的。传统上,对于符合要求的内毒素检测,最终用户必须从标准内毒素库存瓶中构建至少一式两份三点标准曲线;必须有重复的阴性控制;每个样品和PPC必须一式两份。有了Sievers Eclipse内毒素检测仪,这些步骤可以通过使用预嵌入的内毒素标准...
点击进入详情页
本回答由Sievers分析仪提供
展开全部
这不是递归调用吗?就是调用自己,但是每次调用的数据在有变化啊!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个算法是错的。
void Move(int n , char x, char y)
{
std::cout << "把" << n << "号从" << x << "挪动到" << y << std::endl;
}
void Hannoi(int n, char a, char b, char c)
{
if (n == 1)
{
Move(1, a, b);
}
else
{
Hannoi(n-1, a, c, b);
Move(n, a, b);
Hannoi(n-1, c, b, a);
}
}
原理是:
abc三个塔,初始是都在a上,结果要在b上。
如果只有一个的化,就直接方到b上。
不然就
把a上面到都方到c上,
把最大的一个方到b上,
把放到c上到在都放到b上。就ok
void Move(int n , char x, char y)
{
std::cout << "把" << n << "号从" << x << "挪动到" << y << std::endl;
}
void Hannoi(int n, char a, char b, char c)
{
if (n == 1)
{
Move(1, a, b);
}
else
{
Hannoi(n-1, a, c, b);
Move(n, a, b);
Hannoi(n-1, c, b, a);
}
}
原理是:
abc三个塔,初始是都在a上,结果要在b上。
如果只有一个的化,就直接方到b上。
不然就
把a上面到都方到c上,
把最大的一个方到b上,
把放到c上到在都放到b上。就ok
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询