关于汉诺塔游戏的递归算法,求解

JXLFZ 2011-08-29 12:40:04
最近看了下汉诺塔游戏的算法,不懂的地方很多,而且对递归不是很了解。。希望能得到各位的指点。代码如下:

#include<stdio.h>
#include<stdlib.h>
int i=0;
void hanoi(int n,char A,char B,char C){
if(n==1){
printf("Move disk %d from %c to %c.\n",n,A,C);
i++;
}
else{
hanoi(n-1,A,C,B);
printf("Move disk %d from %c to %c.\n",n,A,C);
i++;
hanoi(n-1,B,A,C);
}
}

int main(){
int n;
printf("请输入n阶汉诺塔:\n");
while(scanf("%d",&n)==1){
hanoi(n,'A','B','C');
printf("共%d步.\n",i);
i=0;
printf("请输入n阶汉诺塔:\n");
}
system("pause");
return 0;
}

要是说最少用几步完成是有一条公式的:2的n次方减1(n是汉诺塔的阶数)。这条公式我证明过了,但要是想用程序来把每一步都打印出来的话还是不知道怎写,上面的代码是能实现的,可就是有些地方想不通,希望有人能说下这段代码的实现的原理。。。
...全文
449 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
尘缘udbwcso 2011-08-29
  • 打赏
  • 举报
回复
递归就是在过程或函数里调用自身;  
在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
JXLFZ 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]
“给定一个小点的输入,完整单步跟踪一遍。”是理解递归函数工作原理的不二法门!
[/Quote]
呵呵,我正在做这事。。。
limang89 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dmcxnoface 的回复:]

简单的说,函数作用,就是做一件事情。
C/C++ code

viod hanoi(int n,char A,char B,char C)

的作用就是,把A上面的n个盘子,全部移动到C上面去。
那么,相当于把它分解成三个步骤:
1、把A上面的n-1个盘子移到B上去
2、把A上面剩下的1个盘子移到C上去
3、把B上面的n-1个盘子移到C上去。

知道这些以后,再看下面的代码:
……
[/Quote]

正解。。把n-1个盘子看做一个整体。。
赵4老师 2011-08-29
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪一遍。”是理解递归函数工作原理的不二法门!
i945800687 2011-08-29
  • 打赏
  • 举报
回复
以3层为例:

hannuo(3,a,b,c)
{
hannuo(2,a,c,b)
{
hannuo(1,a,b,c)
A--C
move(a,b)
A--B
hannuo(1,c,a,b)
C--B
}
move(a,c)
A--C
hannuo(2,b,a,c)
{
hannuo(1,b,c,a)
B--A
move(b,c)
B--C
hannuo(1,a,b,c)
A--C
}
}



看清从属关系
西方惨败 2011-08-29
  • 打赏
  • 举报
回复
简单的说,函数作用,就是做一件事情。

viod hanoi(int n,char A,char B,char C)

的作用就是,把A上面的n个盘子,全部移动到C上面去。
那么,相当于把它分解成三个步骤:
1、把A上面的n-1个盘子移到B上去
2、把A上面剩下的1个盘子移到C上去
3、把B上面的n-1个盘子移到C上去。

知道这些以后,再看下面的代码:

void hanoi(int n,char A,char B,char C){
if(n==1){ //如果A上面只有一个盘子,直接从A移动到C上。
printf("Move disk %d from %c to %c.\n",n,A,C);
i++;
}
else{
hanoi(n-1,A,C,B); //否则就是上面第一条 1、把A上面的n-1个盘子移到B上去
printf("Move disk %d from %c to %c.\n",n,A,C); //然后第二条:2、把A上面剩下的1个盘子移到C上去
i++;
hanoi(n-1,B,A,C); //再然后第三条:3、把B上面的n-1个盘子移到C上去。
}
}
是不是这种情况?
zjxylc 2011-08-29
  • 打赏
  • 举报
回复
你的汉诺塔最终是从A-C的,如果只有一块则直接从A-C,否则的话,线以B,C为中介,将A上除了最大的一块外全部移到B上,把最大一块从A-C,hanoi(n-1,A,C,B);此时有n-1块盘在B上,你可以把B看为上一次的A,将B上的盘除第二大得全部借组A,C移到A,再将第二大得移动到C, hanoi(n-1,B,A,C);如此循环就行了。
JXLFZ 2011-08-29
  • 打赏
  • 举报
回复
这些递归的用法我也知道,可是我想知道的事解决这个汉诺塔的问题。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧