如何将迭代代码更改为递归代码?

时间:2014-11-18 08:26:04

标签: c recursion

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

的屏幕截图

1 个答案:

答案 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,它就不会增加堆栈