标题:求详细解释汉诺塔c语言递归函数的一段代码是怎么样运行的。谢谢啦
只看楼主
咖灬啡
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-9-15
结帖率:100%
 问题点数:0 回复次数:5 
求详细解释汉诺塔c语言递归函数的一段代码是怎么样运行的。谢谢啦
用n=3为例吧。。
这个思想我知道。但是用到C语言上就不知道该怎么弄了  很模糊。
想把n個環由1柱移到3柱
就是先把上面n-1個環由1柱移到2柱
然後把底環由1柱移到3柱
再把上面n-1個環由2柱移到3柱.

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int hanoi(int n,char one,char two,char three);
    int m;
    printf("input the number of diskes:");
    scanf("%d",&m);
    printf("The step to moving %d disk:\n",m);
    hanoi(m,'A','B','C');
    system("pause");
    }

int hanoi(int n,char one,char two,char three)
{
    int 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);
        }
    }

int move(char x,char y)
{
    printf("%c-->%c\n",x,y);
    }

其中int hanoi(int n,char one,char two,char three)
{
    int 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);
        }
    }这段看不懂。。运行结果是
input the number of diskes:3
The step to moving 3 disk:
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
请按任意键继续. . .

下面是我觉得应该这样执行的。想着想着就乱了
hanoi(3-1,one,three,two);
{
     int move(char x,char y);
    if(n==1)
    move(one,three);
    else
{

        hanoi(2-1,one,three,two);
        {
            move(one,three);               执行的第一条

        }
        move(one,three);                   执行的第二条  这里我就觉得不对了
        hanoi(2-1,two,one,three);
       {
            move(one,three);              执行的第三条   不知道是move(one,three);   还是move(two,three);              

        }

        }   
}
        
move(one,three);                          执行的第四条
        hanoi(3-1,two,one,three);
{
int move(char x,char y);
    if(n==1)
    move(one,three);
    else
    {
        hanoi(2-1,one,three,two);
        {
        move(one,three);          执行的第五条  不知道是move(one,three); 还是move(one,two);              
        }


        move(one,three);            执行的第六条 不知道是move(one,three); 还是move(one,two);
        hanoi(2-1,two,one,three);
        {
        move(one,three);              执行的第七条 不知道是move(one,three);                还是       move(two,three);     
}

        }
}
这样执行的就是A-->C   A-->C B-->C  B-->C  A-->B A--B   B-->C
搜索更多相关主题的帖子: include system moving number c语言 
2013-09-16 07:42
jg658237
Rank: 7Rank: 7Rank: 7
来 自:青藏高原
等 级:黑侠
帖 子:224
专家分:529
注 册:2013-8-8
得分:0 
真心表示看不懂啊

武功再高也怕菜刀.
2013-09-16 09:55
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
得分:0 
#include<stdio.h>
void hanoi(int n,char A,char B,char C)
{
  if(n==1)
     printf("Move sheet %d from %c to %c\n", n, A, C);
  else{
     hanoi(n-1,A,C,B);
     printf("move sheet %d from %c to %c\n",n,A,C);
     hanoi(n-1,B,A,C);
  }
}
main()
{
  int n;
  printf("请输入盘数:");
  scanf("%d",&n);
  hanoi(n,'A','B','C');
  return 0;
}

这是经典程序里的一个算法   看看吧

三十年河东,三十年河西,莫欺少年穷!
2013-09-16 11:00
qwe885167759
Rank: 4
等 级:业余侠客
威 望:5
帖 子:148
专家分:259
注 册:2013-3-12
得分:0 
你先看一下栈的存储方式,函数的递归调用你就应该懂了。
另外,给你举个例子:
int f(n)
{   int c;
    if (n==1)
    c=10;
    else
     c=f(n);
return(c);
}
实质就是:例如——当你要调用三次时  c=f(f(f(n)))就像是高中数学上的复合函数一样。

我本楚狂人,凤歌笑孔丘
2013-09-16 13:02
凉里个凉
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2017-11-2
得分:0 
表示真心看不懂
2017-11-02 11:30
凉里个凉
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2017-11-2
得分:0 
表示真心看不懂
2017-11-02 11:30



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




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

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