建议你重温一下数学归纳法求n的阶程,
1: 如果n=1,则n的阶程=1
2:如果n>1,则n的阶程=n * (n-1)的阶程。

解决方案 »

  1.   

    junzhang4008 能说的具体一点吗
      

  2.   

    可是参数问题是一个复杂的问题,每一次的目标塔,中转塔,以及初始塔的都在变化,如果设计递归函数的参数时怎么能确定它就是按照预想的方式去执行的,这个问题很关键,如有满意的答案http://community.csdn.net/Expert/topic/5688/5688824.xml?temp=.2128107 连同这个贴一起结,不知哪位高手有兴趣
      

  3.   

    可是参数问题是一个复杂的问题,每一次的目标塔,中转塔,以及初始塔的都在变化,如果设计递归函数的参数时怎么能确定它就是按照预想的方式去执行的,这个问题很关键,如有满意的答案http://community.csdn.net/Expert/topic/5688/5688704.xml?temp=.2724726连同这个贴一起结,不知哪位高手有兴趣
      

  4.   

    hanoi(n - 1, one, three, two);move(one, three);hanoi(n - 1, two, one, three);
    将n-1个盘子经过three转到two
    将剩下的一个盘子移到three
    再将那n-1个盘子经过one移到three
    然后1,3步骤在进行如上操作,知道剩下一个盘子。if (n == 1) move(one, three);
    然后再由(n==1)的情况递推得到结果
    递归是典型的,将人的操作降到最低,电脑运算升到最高的算法,从效率的角度看是不提倡的
      

  5.   

    1.A塔是个汉诺塔,有3个圈,从上往下依次是有小至大,大的不能压在小的上面;
    2.进入hanoi(3, 'A', 'B', 'C')方法,由于n=3,故进入else循环,此时递归调用,又遇到hanoi方法,但hanoi(2,'A','C','B'),此时n=2,又进入else循环,hanoi(1,'A','B','C'),此时n=1,进入if循环,执行move('A','C')方法,故在控制台输出A->C,此时n=1执行完毕;
    3.同理,逆方向思考,此时程序已经将hanoi(1,'A','B','C')执行完毕了,在n=2时,执行move('A','B')故在控制台输入A->B;
    4.然后程序执行hanoi(1, 'A','C' ,'B' ),执行move('C','B')这时,彻底将n=2执行完;
    5.同理,执行N=3,过程有点长,但原理是不变的,所以省略了,各位自己应该已经会了;
    -------------------------------------------------------
    塔的移动过程:
    1.先将a塔最上面的圈取下,放到c塔;
    2.再将a塔第二个圈取下,放到b塔;
    3.再将c塔上的圈,放到b塔;
    4.将a塔上的圈取下,放到c塔,此时a塔为空,b塔为一个n=2的汉诺,c塔目标塔;
    5.同理,再对b塔递归,直到其n=0;
    -------------------------------------------------------
    给分哦!!!我是今年考研,所以才复习过的,所以还是有点记忆的,可能表述不太清楚,但过程应该没有错的,递归的效率无论是从空间复杂度来说,还是时间复杂度来说,效率都是很高的能写出递归算法,应该是很优秀的算法了,整个过程就是先压栈,到达条件后,在依次出栈,故可以逆向的思考!
      

  6.   


    #include <iostream>    
    void hano(int n,char a,char b,char c);
    void move( char source,char dest);  
    using namespace std;  
      
    int main()
    {
    int n ;
    cin>>n;
    cout<<"共:"<<n<<"个盘子"<<endl;
    hano(n,'1','2','3');
    cout<<"end"<<endl;
    return 0;
    }
    void hano(int n,char a,char b,char c)
    {
    cout<<"hello"<<endl;
    if (n==1)
    {
    move (a,c);
    }
    else
    {
    cout<<"n="<<n<<"$"<<endl;
    cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;
    cout<<"c="<<c<<endl;
    cout<<"开始"<<endl;
    hano(n-1,a,c,b);
    cout<<"n="<<n<<"@"<<endl;
    cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;
    cout<<"c="<<c<<endl;
    cout<<"中间"<<endl;
    move(a,c);
    cout<<"n="<<n<<"#"<<endl;
    hano(n-1,b,a,c);
    cout<<"n="<<n<<endl;
            cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;
    cout<<"c="<<c<<endl;
    cout<<"最后"<<endl;
    }
    }
    void move( char source,char dest)
    {
    cout<<"把 "<<source<<" 上的石块移到"<<dest<<"上"<<endl;
    }
    可以在程序中加入输出,就可以看出汉诺塔程序是咋执行的了