繁体   English   中英

在数组中查找6的递归

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM