我是递归的新手,并试图了解它是如何工作的,并试图追踪它如何接近以找到答案。下面编写的代码找出整数数组中搜索到的数字的最后一个索引,例如{{ 1}},此数组中搜索到的数字为in[4]={1,2,3,2}
。
这个问题的答案是2
,因为它是最后一个索引。现在我将尝试编写这段代码是如何做到的。3
是输入数组,stin是起始整数和数字找到的是in[]
。
在行int和lastINdex(in,stin + 1,size,num)中,函数被递归调用到它的基本情况,即它的大小变为stin == siz.then它的值返回给函数已经调用它。我的问题是这个函数在递归语句之后将如何到达该行。请提供此代码的解释。
num
答案 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。否则,我们寻找在数组尾部找到的数字。如果可以在那里找到它,我们返回在递归调用中找到的索引。否则,我们测试当前位置是否与要查找的所需数字相等,因为它不会出现在数组的尾部。总的来说,这将返回搜索到的数字最右边出现的索引(如果它包含的话)。
退步'通过递归调用返回是通过调用栈完成的;每个递归调用都有自己的一组局部变量。