求教!汉诺塔问题
每本C语言书上有一个经典的递归调用,Hanoi,相信大家都知道,研究了很久也没搞清楚hanoi函数是怎么工作的。
源代码:
#include<stdio.h>
void main()
{
void hanoi(int n,char one,char two,char three);/*hanoi原型声明*/
int m;
printf("input the number of disks:");
scanf("%d",&m);
printf("The step to moving %d diskes:\n",m);
hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char two,char three) /*定义hanoi函数*/
{
void move(char x,char y); /*对move函数的声明*/
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)
{
printf("%c-->%c\n",x,y);
}
答案:input the number of diskes:3
The step to moving the 3 diskes:
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
我是这么分析的,main函数中调用hanoi函数,n=3大于1,执行hanoi(n-1),一直执行知道hanoi(1),输出A-->B
然后再执行move(one,three)输出A-->B,在执行hanoi(n-1);
很明显分析有错!请高手指正,给出详细的分析步骤。
源代码:
#include<stdio.h>
void main()
{
void hanoi(int n,char one,char two,char three);/*hanoi原型声明*/
int m;
printf("input the number of disks:");
scanf("%d",&m);
printf("The step to moving %d diskes:\n",m);
hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char two,char three) /*定义hanoi函数*/
{
void move(char x,char y); /*对move函数的声明*/
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)
{
printf("%c-->%c\n",x,y);
}
答案:input the number of diskes:3
The step to moving the 3 diskes:
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
我是这么分析的,main函数中调用hanoi函数,n=3大于1,执行hanoi(n-1),一直执行知道hanoi(1),输出A-->B
然后再执行move(one,three)输出A-->B,在执行hanoi(n-1);
很明显分析有错!请高手指正,给出详细的分析步骤。
...全文
相关推荐
汉诺塔问题matlab代码
设A、B、C三个塔座,在A上叠加着从大到小的n个圆盘,要求把A上的圆盘移到C上,打印每一个圆盘移动轨迹: 每次只能移动一个圆盘; 任何时刻不允许将大圆盘放在小圆盘之上; 可借助辅助塔B
汉诺塔问题并计算总次数
汉诺塔问题并计算总次数--C++源代码,本资源不仅给出了源代码,还进行了结果分析与比较!
函数递归调用-汉诺塔问题_c++实现汉诺塔问题_
利用函数递归调用的方法,实现了汉诺塔问题
c++递归实现汉诺塔问题
c++递归实现汉诺塔问题。 算法分析与设计 例题的源码实现。跟书上的一样。
汉诺塔问题及变体
C++语言递归算法求解原始汉诺塔问题,邻近移动汉诺塔问题,循环移动汉诺塔问题,奇偶汉诺塔问题


新手乐园
