追溯递归调用

时间:2017-03-22 14:56:56

标签: arrays recursion

我是递归的新手,并试图了解它是如何工作的,并试图追踪它如何接近以找到答案。下面编写的代码找出整数数组中搜索到的数字的最后一个索引,例如{{ 1}},此数组中搜索到的数字为in[4]={1,2,3,2}。 这个问题的答案是2,因为它是最后一个索引。现在我将尝试编写这段代码是如何做到的。3是输入数组,stin是起始整数和数字找到的是in[]

  1. 在行int和lastINdex(in,stin + 1,size,num)中,函数被递归调用到它的基本情况,即它的大小变为stin == siz.then它的值返回给函数已经调用它。我的问题是这个函数在递归语句之后将如何到达该行。请提供此代码的解释。

    num

1 个答案:

答案 0 :(得分:0)

实现将在递归调用之后通过返回来到达该行。如果一个人不熟悉递归,可能会有一些时间习惯它。如果您能够使用调试器,我强烈建议您试验它并检查调用堆栈和局部变量值。但是,递归调用的顺序可以如下扩展,使用您的示例,使用伪编码表示法,其中插入值。

1. call lindex({1,2,3,4}, 0, 2):
   int size=strlen(in); // assigns 4
   if(0 == 4){          // condition is false
   }
   int ans = lastIndex({1,2,3,4}, 1, 2); // assigns 3, as we see below
   if(3 != -1){         // condition is true
       return 3;
   }

2. call lindex({1,2,3,4}, 1, 2):
   int size=strlen(in); // assigns 4
   if(1 == 4){          // condition is false
   }
   int ans = lastIndex({1,2,3,4}, 2, 2); // assigns 3, as we see below
   if(3 != -1){         // condition is true
       return 3;
   }

3. call lindex({1,2,3,4}, 2, 2):
   int size=strlen(in); // assigns 4
   if(2 == 4){          // condition is false
   }
   int ans = lastIndex({1,2,3,4}, 3, 2); // assigns 3, as we see below
   if(3 != -1){         // condition is true
       return 3;
   }

4. call lindex({1,2,3,4}, 3, 2):
   int size=strlen(in); // assigns 4
   if(3 == 4){          // condition is false
   }
   int ans = lastIndex({1,2,3,4}, 4, 2); // assigns -1, as we see below
   if(-1 != -1){         // condition is false
   }else{
       if(in[3] == 2){   // condition is true
       return 3;
   }

5. call lindex({1,2,3,4}, 4, 2):
   int size=strlen(in); // assigns 4
   if(4 == 4){          // condition is true
       return -1;
   }

如果我们讨论各个步骤的语义,则实现变得更容易访问。首先,检查起始索引是否指向数组,在这种情况下,找不到所需的数字并返回-1。否则,我们寻找在数组尾部找到的数字。如果可以在那里找到它,我们返回在递归调用中找到的索引。否则,我们测试当前位置是否与要查找的所需数字相等,因为它不会出现在数组的尾部。总的来说,这将返回搜索到的数字最右边出现的索引(如果它包含的话)。

退步'通过递归调用返回是通过调用栈完成的;每个递归调用都有自己的一组局部变量。