int findnumb(int max)
{
int left,right,total,desk;
for(total=2; total<=max; total++)
{
for(desk=1; desk<total; desk++)
{
left=desk*(desk-1)/2;
right=(total*(total+1)/2)-(desk*(desk+1)/2);
if(left==right)
{
printf("Desk number %d, number of participants %d\n", desk, total);
break;
}
}
}
}
如何将其转换为递归函数?
它在这种形式下运行良好,但是当我尝试将其更改为递归函数时,它会编译,但不能正常工作,我该怎么办?
修改
这是一个像这样的谜语:
假设存在会议,我们不知道有多少人参加会议。 但是,我们看到一个人退出会议。如果我们问男人有多少人 在会议上他只是回答“我不知道”。尽管如此,他说“我坐在上面 编号为x的椅子和我下面和上面的数字的总和等于。其他 单词,如果椅子的数量是x,那么1,2,3 ... .x-1 = x + 1 x + 2 ...... t-1,t(总数) 参与者数)。此外,我们不知道t的值和主席号码x。 参与者总数8和主席号码6是示例配置。因为 1 + 2 + 3 + 4 + 5 = 7 + 8 = 15.您的任务是逐个试用找到类似的配置。
它希望解决方案实现递归函数
第二次修改:
现在我已经制作了一个代码,可以在发现数字和崩溃之后发现它为什么会发生?
以下是代码和崩溃http://imgur.com/a/UgZgC
的屏幕截图答案 0 :(得分:0)
每次迭代中需要更改的变量需要是参数,你需要对函数方法都是正确的,所以不应该打印你应该返回结果:
int findnumb_aux(int max, int total, int desk)
{
if( total > max ) {
return 0; // need to return something when no solution exist
} elseif( desk < total ) {
int left=desk*(desk-1)/2;
int right=(total*(total+1)/2)-(desk*(desk+1)/2);
if(left==right) {
return desk<<8+total; // there are better ways to return two numbers. you figure it out
} else {
return findnum_aux(max, total, desk+1);
}
} else {
return findnum_aux(max,total+1, 1);
}
}
int findnum(int max)
{
return findnum_aux(max, 2, 1);
}
有趣的事实:这段代码仍然是迭代的,因为如果你的C编译器有tail call optimization,它就不会增加堆栈。