关于汉诺塔递归调用问题

L_chxu 2012-09-06 09:26:23
我知道汉诺塔的递归调用是把前n-1个盘子从A上通过C移到B上,然后把第n个盘子从A移到C上,最后通过A,把B上的盘子移到C上,但具体过程还是不是很清楚,为什么可以这样实现。还有盘子为奇数与偶数的时候,第一步移动的方式怎么会不同呢,不是都用递归到移动第一个盘子的时候,就通过C移到B上吗?怎么会有先移到B上的呢?望详解!
...全文
54 点赞 收藏 4
写回复
4 条回复
Gloveing 2012年09月06日
[Quote=引用 3 楼 的回复:]
程序我知道,也知道要把n个盘子从A搬到C上,要搬n-1个,n-2个……1个。递归调用。但是过程不太理解。
关于奇数偶数个盘子的问题是这样的,就是你要搬的盘子总数n(输入的数据),当它为奇数和偶数时,搬的第一步不相同,如从A经过B搬到C:(只写出移动的第一步)
当n=1时:A-->C
当n=2时:A-->B
当n=3时:A-->C
当n=4时:A-->B
也就说,当你输入的n为奇数时A-……
[/Quote]
递归调用,一般要从最后一个、最后两个。。。到过来分析
回复 点赞
L_chxu 2012年09月06日
程序我知道,也知道要把n个盘子从A搬到C上,要搬n-1个,n-2个……1个。递归调用。但是过程不太理解。
关于奇数偶数个盘子的问题是这样的,就是你要搬的盘子总数n(输入的数据),当它为奇数和偶数时,搬的第一步不相同,如从A经过B搬到C:(只写出移动的第一步)
当n=1时:A-->C
当n=2时:A-->B
当n=3时:A-->C
当n=4时:A-->B
也就说,当你输入的n为奇数时A-->C,n为偶数时A-->B.
求解!
回复 点赞
zc01@ 2012年09月06日

#include<stdlib.h>
#include<stdio.h>

#define YI 1
#define ER 2
#define SAN 3

void ydyp(int,int,int,int);

int main(void)
{
int n;
printf("请输入圆盘的个数\n");
scanf("%d",&n);
if (n>0)
{
ydyp(n,YI,ER,SAN);
}
else
printf("输入不合理数值\n");
system("PAUSE");
return 0;
}
void ydyp(int n,int yi,int er,int san)
{
if(n>0)
{
ydyp(n-1,yi,san,er);
printf("从第%d跟柱子移动一个圆盘到第%d跟柱子\n",yi,san);
ydyp(n-1,er,yi,san);
}
return;
}


程序看看吧
回复 点赞
Mr_defy_L 2012年09月06日
奇数偶数都相同啊,要先把n-1盘子移到b上再从a上把第n个移到c,同理移走b上面的n-2到a,再把b上的第n-1移动c,
总之要把最底下拿出来,就必须把上面的那些都倒出来,
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告