【问题标题】:Recursive Statement not Instantly Returning递归语句不立即返回
【发布时间】:2019-01-21 20:49:29
【问题描述】:

我正在创建一个采用数字列表和索引的方法。

如果索引后面有一个数字是第一个数字的六倍,则返回 true。否则,它返回 false。

 public static boolean firstElementMultiple(int []Numbers, int index) {
        System.out.println(Numbers[index]);

        if ((Numbers[0]*6)==Numbers[index]){
            System.out.println("Yep");
            return true;
        }

        if (index+1 >= Numbers.length){
            return false;
        }


        firstElementMultiple(Numbers, index+1);

        return false;

对于 {5,6,7,30} 和索引 1 的列表,即使 30 在列表中,也会返回 false。

6 7 30 是的

已打印,这表明它确实识别出 30 在列表中。但是,即使 next 语句为 true 并且应该停止该方法,它仍然返回 false?

这必须通过递归来完成。

编辑:我必须把'return false;'最后,没有它,它不会让我。但是,我看不出它是如何到达那里的,因为总会有递归调用。

【问题讨论】:

  • 也许返回你递归调用的结果,而不是一堆return false/return true;
  • 递归是对自身的调用。在您的情况下,在某些时候您的方法应该调用自己。您需要确保您也可以满足您的结束条件(因此在某些时候返回 false 或 true)。我的猜测是您可能希望在测试结束条件后返回对您的方法的调用 :) (顺便说一句,根据您的初始参数,您可能会收到一个 stackoverflow 错误,这里有点“元”:D)

标签: java recursion


【解决方案1】:
firstElementMultiple(Numbers, index+1);
return false;

您的方法到此结束。这就是它的作用。它说“致电firstElementMultiple 继续寻找我们正在寻找的价值。一旦您完成寻找,完全忽略您是否找到它并返回false。”

鉴于此,您如何修复它以执行您希望它执行的操作,即 return 无论我们是否找到该元素?

【讨论】:

  • 但是return语句不是应该立即返回而不是等到递归结束吗?
  • 是的,return 语句从当前函数返回,而不是从所有函数返回。想象一下,如果整个程序中的每个函数都返回一个return 语句;那么程序中的第一个返回将结束 main 并终止程序。
【解决方案2】:

因为最终,无论您在进一步计算中得到什么,您都会在递归函数中返回 false。您应该将代码更改为:

public static boolean firstElementMultiple(int []Numbers, int index) {
    System.out.println(Numbers[index]);

    if ((Numbers[0]*6)==Numbers[index]){
        System.out.println("Yep");
        return true;
    }

    if (index+1 >= Numbers.length){
        return false;
    }

    return firstElementMultiple(Numbers, index+1);
}

基本上你需要改变

firstElementMultiple(Numbers, index+1);
return false;

return firstElementMultiple(Numbers, index+1);

【讨论】:

  • 这不起作用,因为我收到“缺少返回语句”错误。
猜你喜欢
  • 2015-12-22
  • 2020-08-09
  • 2010-10-30
  • 2019-10-07
  • 2016-02-13
  • 2017-07-21
  • 2013-03-10
  • 2020-04-11
  • 2014-02-03
相关资源
最近更新 更多