[英]Recursion for finding a 6 in an array
所以我尝试了一下,最终使它起作用。 我有一个问题,为什么我需要一个“返回” array6(nums,index + 1); 而不是仅仅让它递归调用array6(nums,index +1)。
public boolean array6(int[] nums, int index) {
boolean contains = false;
if( nums.length == 0)
{
contains = false;
} else {
if(nums[index] == 6)
{
contains = true;
} else {
if(index + 1 == nums.length)
{
contains = false;
} else {
return array6(nums, index + 1);
}
}
}
return contains;
}
这是关于recursion
一个非常基本的问题。
一个简单的解释:想象一下,在您分支出的每个递归调用中,当您结束工作时,您想返回到每个分支,结果是您在分支中获得的进一步收益。
您不需要return array6
但是您确实需要以某种方式用信号通知您递归找到的方法。
您可以通过执行返回操作(如在代码中)或通过执行`contains = array6(nums,index + 1);来实现。
否则,即使您的一个递归调用找到一个匹配项,您也将在第一次返回true后在链上返回false。
假设您不使用return,您的代码将如下所示:
} else {
array6(nums, index + 1);
}
如果对array6 DID的调用找到了6,该怎么办? 您将不会知道,因为答案是array6返回的结果,所以您将其存储在另一个变量中(例如contains
并稍后返回),或者直接使用return
语句将其return
。
因此,每个函数调用都会在堆栈上分配一些位。 每个递归调用都会创建一个指向堆栈上下一个函数调用的链接。
注意:由于我简化了许多后端内容,因此以下内容并不完全准确。
因此,要逐步执行,请采样数组{2,2,6} [call#,return]
第一次通话,我们从索引0开始
[1,-returns new call-] //还没有6,中途呼叫
[1,[2,-返回新呼叫-]] //否6
[1,[2,[3,-在索引'2'处找到6,然后返回-]]]
[1,[2,-3rd调用返回'true']]
[1,-2nd调用返回'true']
答案是真的。
同样,解决该问题的更简单方法是:
public boolean array6(int[] nums, int index) {
if( index < 0 || index > nums.length){ // index is out of bounds or not found
return false;
} else if( nums[index] == 6 ){
return true; // If we see it, return true.
} else {
return array6( nums , index + 1 );
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.