鱼C论坛

 找回密码
 立即注册
查看: 2773|回复: 3

c语言递归求解

[复制链接]
发表于 2013-11-14 16:31:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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);
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-11-14 17:21:49 | 显示全部楼层
hanoi(n-1,A,C,B);
    move(A,C);
    hanoi(n-1,B,A,C); 这里的 参数有什么关系? 为什么 不会随上面的变化而变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-14 19:14:41 | 显示全部楼层
看了好几次教程,递归汉诺塔,没看明白,唉,智商可能不够:mad:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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:}。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-23 14:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表