本帖最后由 桃花飞舞 于 2022-7-25 01:11 编辑
我看错了,我道歉,你的问题很简单,不会无限制的递归,一开始就说了输入的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][1] = begin;
- schedule[begin][2] = begin + 1;
- schedule[begin+1][1] = begin + 1;
- schedule[begin+1][2] = begin;
- return 0;
- }
复制代码
另外他代码可以去掉小的部分看整体的流程 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();
- 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[i][j] = schedule[i-num/2][j-num/2];
- }
- }
- for (i = begin; i < begin + num/2; i++)
- {
- for (j = num/2 + 1; j <= num; j++)
- {
- schedule[i][j] = schedule[i+num/2][j-num/2];
- }
- }
复制代码
这里也是把相应规律的数值存储到schedule[][]全局数组里面
具体的处理你自己看吧