注册 登录
编程论坛 C++教室

汉诺塔问题,可以这样写?return ;?

跳跳鱼 发布于 2012-09-03 16:28, 486 次点击
这是汉诺塔问题的源码,其中有些部分不太明白,谁能帮我解释一下?谢啦!
程序代码:
#include <iostream>
using namespace std;
void tower(int ,int ,int ,int );
int main()
{
    int panshu;
    cout<<"请输入您要移动的盘子数量:"<<endl;
    cin>>panshu;
    tower(panshu,1,3,2);
    return 0;
}
void tower(int disk,int start,int end,int temp)
{
    if(disk==1)
    {
        cout<<start<<"-->"<<end<<endl;
        return ;}                 //这个地方,为什么会返回  return ; ?可以这样写?
    tower(disk-1,start,temp,end);    //以下三句到底表示什么意思?模模糊糊有点明白
    cout<<start<<"-->"<<end<<endl;   //能通俗的解释一下吗      
    tower(disk-1,temp,end,start);     
}
4 回复
#2
pangding2012-09-03 22:03
return 后面没有任何东西的作用和循环进而的 break 差不多。只要看到这个语句,函数就立刻返回。有返回值的话,就返回那个值。void 的函数,就只能单独 return,后面不能加东西了。

void tower(int disk,int start,int end,int temp)
这个函数的意思就是说,将 disk 这么多个盘子,利用 temp 这个柱子,从 start 移到 end 柱子上。

如果 disk 是 1 的话,直接移过去就行,和 temp 没关系。
否则的话,相当于先把上面 disk-1 个盘子移到 temp 上,再把最底下的一个移到 end 上,最后再把之前的那 disk-1 个盘子从 temp 移到 end 上。
#3
pangding2012-09-03 22:05
很经典的递归应用。值得花些心思体会其中蕴含的递归原理。实际要用到的递归,都比这个复杂的多。
什么用递归求阶乘呀,求 fibonacci 数列的例子都是瞎扯的,实际上如果这么用很白痴。
#4
跳跳鱼2012-09-05 16:29
回复 2楼 pangding
我想问一下,关于参数start,temp,end 的顺序变换的方法,如何这样变换才能表达我移动盘子的顺序
#5
senpujituan2012-09-05 18:34
return2楼已经回答了
我来说说后面几句的理解吧:注:1,2.3分别代表start、end、temp
第一步:你想把1上的n个盘移到3上。最终的结果是不是,最大的那个在3上,而其余的n-1个盘是不是应该在2上。
        (你不用考虑那n-1个盘是怎么到2上的,最终结果应该是上面说的吧)
第二步:通过第一步后,1上是空的吧。所以就通过1把2上的n-1个盘移到3上。


这样说应该能明白吧
我自己想想是蛮好理解的,不知道表达的好不好!!
1