c语言汉诺塔问题如下:#include <stdio.h>char move (char x, char y);char hanoi(int n,char a, char b, char c);int main(){int n;char a,b,c;a='A';b='B';c='C';scanf("%d",&n);hanoi (n,a,b,c);}char hanoi(int n,char a,char b, char c){if (n==1){ move(a,c); }else { hanoi(n-1,a,c,b);move(a,c);hanoi(n-1,b,a,c);}return;}char move(char x,char y){ printf("%c->%c\n",x,y);}
2 回答
慕娘9325324
TA贡献1783条经验 获得超4个赞
两个盘子,1表示小的,2表示大的。
(第一层)调用hanoi(2,a,b,c), n==1 不满足,执行else子句(进入第二层的调用),
(第二层)调用hanoi(1,a,c,b),此时满足n==1, 执行move(a,c),(因为此时的c为上次调用传进来的b)即将a柱子上1号盘子移动到b柱子上,返回,
(第二层)执行move( a, c),即将a柱子上2号盘子移动到c柱子上,
(第二层)调用hanoi(1,b,a,c),进入函数后满足n==1执行move(a,c),(此时的a为上次传进来的B),所以将b柱子上的1号盘子移动到c柱子上。
只要看清楚对应关系就能搞清楚
叮当猫咪
TA贡献1776条经验 获得超12个赞
汉诺塔问题是一个递归的经典例子,基本上不用递归不知道如何编程实现。
问题就是从桩子1移到桩子3,借助桩子2.移动N个盘子共移动多少次。
此问题递归解法的解释就是:
先从1移到2,借助3,移动N-1个盘子。此时1上还有一个盘子。即 hanoi(n - 1, one, three, two);
可以直接将一个盘子移到3 move(one, three);
然后将剩余的在2上的N-1个盘子移到3上,借助1 hanoi(n - 1, two, one, three);
这里的1、2、3对应你上面的代码就是ABC
添加回答
举报
0/150
提交
取消