C语言S1E35汉诺塔课后作业求助
S1E35:汉诺塔 | 课后测试题及答案我看不太懂小甲鱼的代码,感觉会在代码的第22行进入不断的递归
arrange(begin, num/2);
有没有大佬给我讲一下程序是怎么运行的?
或者讲解自己编写的代码程序也行{:10_291:} 汉诺塔
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);
}
}
虽然不知为什么可以达到效果不过确实是一个方法 桃花飞舞 发表于 2022-7-24 23:16
汉诺塔
1.将n-1个木块借助C柱由A柱移动到B柱
2.将最底层的唯一木块直接移动到C柱
????我问的课后作业,混鱼币也不带这样的啊 本帖最后由 桃花飞舞 于 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; if (num == 2)
{
schedule = begin;
schedule = begin + 1;
schedule = begin + 1;
schedule = begin;
return 0;
}
另外他代码可以去掉小的部分看整体的流程 int schedule; 这个全局数组存放了后面的按规则得出的值,
在来看arrange(begin,num);这个函数
当num == 2的时候就按照1 2 2 1 的顺序存储到数组schedule schedule schedule schedule的元素中,并return 0;结束函数arrange();
arrange(begin, num/2);
arrange(begin + num/2, num/2);
这两句就是递归也就是先将复杂的问题不断细化,当问题足够小时,解决所有能解决的小问题
所以可以到达出口的部分也就是num == 2的部分
最后 for (i = begin + num/2; i < begin + num; i++)
{
for (j = num/2 + 1; j <= num; j++)
{
schedule = schedule;
}
}
for (i = begin; i < begin + num/2; i++)
{
for (j = num/2 + 1; j <= num; j++)
{
schedule = schedule;
}
}
这里也是把相应规律的数值存储到schedule[][]全局数组里面
具体的处理你自己看吧 桃花飞舞 发表于 2022-7-25 00:49
我看错了,我道歉,你的问题很简单,不会无限制的递归,一开始就说了输入的num的值是2的n次方arrange(be ...
哦哦哦,懂了,谢啦
页:
[1]