12月30日 发表于 2013-11-14 16:31:25

c语言递归求解

#include <stdio.h>
int i=0;
void move(char x,char y)
{
printf("%c- - >%c\n",x,y);
i++;
}
void 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);
   }
}
main()
{
int m;
printf("请输入盘子的个数:");
scanf("%d",&m);
printf("搬运这 %3d 个盘子的具体步骤如下:\n",m);
hanoi(m,'A','B','C');
printf("至少需要搬%d次\n",i);
}


12月30日 发表于 2013-11-14 17:21:49

hanoi(n-1,A,C,B);
    move(A,C);
    hanoi(n-1,B,A,C); 这里的 参数有什么关系? 为什么 不会随上面的变化而变

puzy444 发表于 2013-11-14 19:14:41

看了好几次教程,递归汉诺塔,没看明白,唉,智商可能不够:mad:

北林之中 发表于 2013-11-14 21:21:49

程序的意图应该是A上有N个盘子,顺序不变移动到C处,hanoi函数的算法应该是将A处最上面的N-1个盘子先移动到B(顺序不变),再将A处最下面的盘子移动到C,接下来将B处的N-1个盘子移动到C(还是顺序不变),具体分析是:
N=1,A->C;
N=2,A->B(用hanoi(1,A,C,B)实现),此处将最上面N-1个(即1个)移动到B,A->C(move(A,C)实             现),B->C(用hanoi(1,B,C,A)实现),此时,hanoi(2,A,B,C)实现了两个盘子的从A按顺序移动到C;
N=3,hanoi(2,A,C,B)实现了最上面两个(即N-1个)按顺序从A移动到B,move(A,C)实现了A处最下面那个盘子从A到C,hanoi(2,B,A,C)实现了B上面两个盘子(即N-1个)按顺序移动C,自此,hanoi(3,A,B,C)实现了3个盘子从A按顺序移动到C;
N=4,hanoi(3,A,C,B)实现了最上面三个(即N-1个)按顺序从A移动到B,move(A,C)实现了A处最下面那个盘子从A到C,hanoi(3,B,A,C)实现了B上面三个盘子(即N-1个)按顺序移动C,自此,hanoi(4,A,B,C)实现了4个盘子从A按顺序移动到C;
N=.....(以此类推)
感觉函数递归有时候也是在找规律,看参数为N时的函数如何用函数参数为N-1加上一些固定的操作实现,这段时间也在学习C语言,发下自己的想法,大家交流下{:1_1:}。
页: [1]
查看完整版本: c语言递归求解