多次调用一个函数

时间:2018-07-05 01:42:02

标签: c recursion logic

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

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);
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

让我们逐行走

  1. 首先,您的sort函数将针对参数0和10运行,这将是对该函数的首次调用。
  2. if(low < high)行开始,由于0 <10,所以中间将是5:因为mid = (low + high) / 2;
  3. 现在将再次对参数0和5运行sort函数,这将是对该函数的第二次调用,但是请记住,第一次调用仍未完成其工作。
  4. 由于0 <5,所以mid将为2。
  5. 现在,这次排序函数将再次针对参数0和2运行,这将是第三个调用,第二个函数将继续工作。
  6. 因为0 <2中将是1。
  7. 现在,排序函数将再次针对参数0和1运行,这将是第四次调用,并且对该函数的第三次调用将继续起作用。
  8. 因为0 <1中将为0。
  9. 现在,sort函数将再次针对args 0和0运行,这将是第五次调用,并且对该函数的第四次调用将继续起作用。
  10. 因为现在0 <0为false,否则将执行else中的return调用,并且该函数将被销毁。现在,控件将返回到第四调用,该调用对args 0低至1都有效。
  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)的调用将完成执行,您将获得所需的结果。

相关问题