【问题标题】:Calling a function recursively more than once多次递归调用函数
【发布时间】:2018-07-05 01:42:02
【问题描述】:

我是编程新手,请解释一下以下递归函数的工作原理。函数被递归调用了两次,第一次递归调用之后的语句会被执行吗?

void sort(int low, int high) {
   int mid;

   if(low < high) {
      mid = (low + high) / 2;
      sort(low, mid);
      sort(mid+1, high);
      merging(low, mid, high);
   } else { 
      return;
   }   
}
void main()
{
   sort(0, 10);
}

【问题讨论】:

  • 排序中的else { return; } 确实没有帮助,特别是因为没有return after the call to merging()`。

标签: c recursion logic


【解决方案1】:

一行一行

  1. 首先您的排序函数将针对参数 0 和 10 运行,这将是对该函数的第一次调用。
  2. 从if(low &lt; high) 行开始,因为 0 mid = (low + high) / 2;。
  3. 现在 sort 函数将再次针对 args 0 和 5 运行,这将是对该函数的第二次调用,但请记住,第一次调用仍未完成其工作。
  4. 由于 0
  5. 现在排序函数将再次为 args 0 和 2 运行,这将是第三次调用,第二个函数将继续工作。
  6. 因为 0
  7. 现在排序函数将再次为 args 0 和 1 运行,这将是第四次调用,对函数的第三次调用将继续工作。
  8. 因为 0
  9. 现在排序函数将再次为 args 0 和 0 运行,这将是第五次调用,并且对该函数的第四次调用将继续工作。
  10. 由于 0
  11. 现在从代码的第五行 sort(mid+1, high); 开始,这次将再次调用低 = 1 和高 = 1。
  12. 现在将再次调用 sort 函数,这是第六次调用,这次它将针对 args low = 1 和 high = 1 运行,并且将从代码的第一行开始执行。

将其视为一个堆栈,首先推送sort(0,10) 然后=> sort(0,5) 然后=> sort(0,2) 然后=> sort(0,1) 然后=> sort(0,0)

现在,由于sort(0,0) 完成执行,它将从堆栈中删除,sort(0,1) 将继续执行。 所以它应该是这样的

sort(0,10) => sort(0,5) => sort(0,2) => sort(0,1)

再次在sort(0,1) 的第五行调用sort(),因此再次将排序推送到此堆栈:

sort(0,10) => sort(0,5) => sort(0,2) => sort(0,1) => sort(1,1)

这将继续,最后对sort(0,10) 的调用将完成执行,您将获得所需的结果。

【讨论】:

  • 我不明白 sort(mid+1, high) 何时开始执行.. 因为我只能得到数组的左侧.. 右侧假设是什么:sort(mid+1, high) == sort(0,1) or sort(5,10). 这是怎么回事部分会发生..
【解决方案2】:

请参阅堆栈溢出的递归示例链接。 Examples of Recursive functions

你想在代码中实现什么?递归函数应该调用函数本身,并且它应该具有停止的条件,否则它将进入无限循环。您编写的代码两次调用了相同的函数,这是不正确的。您应该调用该函数一次并带有停止条件。

【讨论】:

  • if (low &lt; high) 是停止的条件。递归两次并没有错。这基本上是快速排序。
猜你喜欢
  • 2018-04-10
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 2019-12-14
  • 2020-04-21
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
相关资源
最近更新 更多