鱼C论坛

 找回密码
 立即注册
查看: 1507|回复: 4

[已解决]C语言S1E35汉诺塔课后作业求助

[复制链接]
发表于 2022-7-24 22:56:37 | 显示全部楼层 |阅读模式

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

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

x
S1E35:汉诺塔 | 课后测试题及答案

我看不太懂小甲鱼的代码,感觉会在代码的第22行进入不断的递归

  1.         arrange(begin, num/2);
复制代码

有没有大佬给我讲一下程序是怎么运行的?

或者讲解自己编写的代码程序也行
最佳答案
2022-7-25 00:49:48
本帖最后由 桃花飞舞 于 2022-7-25 01:11 编辑
治愈罗小黑 发表于 2022-7-24 23:29
????我问的课后作业,混鱼币也不带这样的啊


我看错了,我道歉,你的问题很简单,不会无限制的递归,一开始就说了输入的num的值是2的n次方arrange(begin, num/2);  由arrange(1, num);这句知道begin == 1   函数arrange(begin, num/2);实参num/2的值是原来arrange(1, num);实参num 的一半,所以实参的值是原来实参num值得一半,不断这样重复 出口就是总有实参的值为2的时候,这时候就return 0;
  1.         if (num == 2)
  2.         {
  3.                 schedule[begin][1] = begin;
  4.                 schedule[begin][2] = begin + 1;
  5.                 schedule[begin+1][1] = begin + 1;
  6.                 schedule[begin+1][2] = begin;
  7.                 return 0;
  8.         }
复制代码

另外他代码可以去掉小的部分看整体的流程 int schedule[MAX_NUM+1][MAX_NUM+1]; 这个全局数组存放了后面的按规则得出的值,
在来看arrange(begin,num);这个函数
当num == 2的时候就按照1 2 2 1 的顺序存储到数组schedule[1][1] schedule[1][2] schedule[2][1] schedule[2][2]的元素中,并return 0;结束函数arrange();
  1.         arrange(begin, num/2);
  2.         arrange(begin + num/2, num/2);
复制代码

这两句就是递归也就是先将复杂的问题不断细化,当问题足够小时,解决所有能解决的小问题
所以可以到达出口的部分也就是num == 2的部分
最后
  1.         for (i = begin + num/2; i < begin + num; i++)
  2.         {
  3.                 for (j = num/2 + 1; j <= num; j++)
  4.                 {
  5.                         schedule[i][j] = schedule[i-num/2][j-num/2];
  6.                 }
  7.         }

  8.         for (i = begin; i < begin + num/2; i++)
  9.         {
  10.                 for (j = num/2 + 1; j <= num; j++)
  11.                 {
  12.                         schedule[i][j] = schedule[i+num/2][j-num/2];
  13.                 }
  14.         }
复制代码

这里也是把相应规律的数值存储到schedule[][]全局数组里面
具体的处理你自己看吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-24 23:16:13 | 显示全部楼层

回帖奖励 +20 鱼币

汉诺塔
1.将n-1个木块借助C柱由A柱移动到B柱
2.将最底层的唯一木块直接移动到C柱
3.将n-1个木块借助A柱由B柱移动到C柱
void Hanio_Rec(int n, char a, char b, char c)
{
    if( n > 0)
    {
        Hanio_Rec(n-1, a, c, b);
        printf("%c -> %c \n", a, c);
        Hanio_Rec(n-1, b, a, c);
    }
}
虽然不知为什么可以达到效果不过确实是一个方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-24 23:29:40 | 显示全部楼层
桃花飞舞 发表于 2022-7-24 23:16
汉诺塔
1.将n-1个木块借助C柱由A柱移动到B柱
2.将最底层的唯一木块直接移动到C柱

????我问的课后作业,混鱼币也不带这样的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-25 00:49:48 | 显示全部楼层    本楼为最佳答案   
本帖最后由 桃花飞舞 于 2022-7-25 01:11 编辑
治愈罗小黑 发表于 2022-7-24 23:29
????我问的课后作业,混鱼币也不带这样的啊


我看错了,我道歉,你的问题很简单,不会无限制的递归,一开始就说了输入的num的值是2的n次方arrange(begin, num/2);  由arrange(1, num);这句知道begin == 1   函数arrange(begin, num/2);实参num/2的值是原来arrange(1, num);实参num 的一半,所以实参的值是原来实参num值得一半,不断这样重复 出口就是总有实参的值为2的时候,这时候就return 0;
  1.         if (num == 2)
  2.         {
  3.                 schedule[begin][1] = begin;
  4.                 schedule[begin][2] = begin + 1;
  5.                 schedule[begin+1][1] = begin + 1;
  6.                 schedule[begin+1][2] = begin;
  7.                 return 0;
  8.         }
复制代码

另外他代码可以去掉小的部分看整体的流程 int schedule[MAX_NUM+1][MAX_NUM+1]; 这个全局数组存放了后面的按规则得出的值,
在来看arrange(begin,num);这个函数
当num == 2的时候就按照1 2 2 1 的顺序存储到数组schedule[1][1] schedule[1][2] schedule[2][1] schedule[2][2]的元素中,并return 0;结束函数arrange();
  1.         arrange(begin, num/2);
  2.         arrange(begin + num/2, num/2);
复制代码

这两句就是递归也就是先将复杂的问题不断细化,当问题足够小时,解决所有能解决的小问题
所以可以到达出口的部分也就是num == 2的部分
最后
  1.         for (i = begin + num/2; i < begin + num; i++)
  2.         {
  3.                 for (j = num/2 + 1; j <= num; j++)
  4.                 {
  5.                         schedule[i][j] = schedule[i-num/2][j-num/2];
  6.                 }
  7.         }

  8.         for (i = begin; i < begin + num/2; i++)
  9.         {
  10.                 for (j = num/2 + 1; j <= num; j++)
  11.                 {
  12.                         schedule[i][j] = schedule[i+num/2][j-num/2];
  13.                 }
  14.         }
复制代码

这里也是把相应规律的数值存储到schedule[][]全局数组里面
具体的处理你自己看吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-25 10:14:40 | 显示全部楼层
桃花飞舞 发表于 2022-7-25 00:49
我看错了,我道歉,你的问题很简单,不会无限制的递归,一开始就说了输入的num的值是2的n次方arrange(be ...

哦哦哦,懂了,谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 13:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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