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

标签 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;
      }
    }
  }
}

如何将其变成递归函数?

它在这种形式下工作得很好,但是当我尝试将其更改为递归函数时,它可以编译,但无法正常工作,我该怎么办?

编辑:

这是一个像这样的谜语:

假设有一个 session ,但我们不知道有多少人参加。 然而,我们看到一名男子退出了 session 。如果我们问这个人有多少人 出席 session 时他只是回答“我不知道”。尽管如此,他说“我坐在 一把编号为 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

最佳答案

每次迭代中需要更改的变量都需要是参数,并且您需要忠实于函数方法,因此您应该返回结果而不是打印:

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

关于c - 如何将迭代代码更改为递归代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26989689/

相关文章:

c - 为什么内存碎片是 64 位机器上的一个问题?

c - 系统调用写入

java - 数组中最小值的索引; "recursive"

c - 如何检测根递归调用?

python - 列表乘积的递归函数不起作用

c++ - 在 C++ 应用程序中链接到 C 库

python - python 脚本的输出读入 C 程序,无需创建临时文件以在程序之间传递值

python - BST遍历分解复杂度

c - 如何使用 for() 表达式枚举循环链表?

java - 迭代 DFS 比递归 DFS 更快吗?