【问题标题】:Why does my code skip over the return statement in the if statement and then execute the else statement body?为什么我的代码会跳过if语句中的return语句,然后执行else语句体?
【发布时间】:2019-04-10 00:01:04
【问题描述】:

当我使用测试用例 find("mississippi", "sip") 运行我的代码时,它会在下面打印出“sippi”然后是“false”。我对此感到困惑,因为我假设“真实”会被打印出来。

我尝试删除 if 正文中的 return 语句,但出现错误

public static boolean find (String text, String str) //method to find "str" within "text"
    {
        if (text.substring(0, str.length()).equals(str))
        {
            System.out.println(text);
            return true;
        }
        else
        {
            text = text.substring(1);
            find(text, str);
            System.out.println(text);
            return false;
        }
    }

我希望输出是 sippi true,但实际输出是 sippi false

【问题讨论】:

    标签: java return


    【解决方案1】:

    您没有使用对find(...) 的递归调用返回的布尔值,因此如果第一个if 的计算结果为false,您的函数当前总是返回false。在适当的时候需要一个额外的基本情况来返回false

    public static boolean find (String text, String str) {
        if (text.length() < str.length()) { return false; }
    
        if (text.substring(0, str.length()).equals(str))
        {
            return true;
        }
        else
        {
            text = text.substring(1);
            return find(text, str);
        }
    }
    

    【讨论】:

    • 次要细节:可以将if (text.length() &lt; str,length()) return false 添加为第一行,以避免在输入太短时出现索引越界异常。然后可以将text.length() == 0 上的测试作为冗余删除。
    【解决方案2】:

    您递归地向下工作,直到匹配“sip”并打印出“sippi”。然后最里面的调用返回 true。在调用 find() 之后,这会将您带到下一个级别,然后您会再次打印出“sippi”。然后此调用返回 false。在调用 find() 之后,这会将您带到下一个级别,然后打印出“isippi”。这个调用然后返回 false... 等等。

    我看不到任何打印“真”或“假”的东西。

    这似乎是对递归的常见误解。人们得到了嵌套调用部分,但没有得到嵌套返回。每个返回只退出当前级别的调用,而不是整个调用堆栈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-05
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多