为什么我的代码跳过if语句中的return语句,然后执行else语句主体?

时间:2019-04-10 00:01:05

标签: java return

当我使用测试用例find(“ mississippi”,“ sip”)运行代码时,它在下面打印出“ sippi”和“ false”。我对此感到困惑,因为我假设会打印出“ true”。

我尝试在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

2 个答案:

答案 0 :(得分:3)

您没有使用对find(...)的递归调用返回的布尔值,因此,如果第一个false的求值为if,则函数当前始终返回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);
    }
}

答案 1 :(得分:1)

您递归地进行操作,直到获得“ sip”的匹配项并打印出“ sippi”。然后,最里面的调用返回true。在调用find()之后,将您带入下一个级别,然后在此处再次打印出“ sippi”。然后,此调用返回false。在调用find()之后,将您带入下一个级别,并在那里打印出“ isippi”。然后,此调用返回false ...等等。

我看不到任何显示“ true”或“ false”的东西。

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