Почему мой код пропускает оператор return в операторе if, а затем выполняет тело оператора else? - PullRequest
0 голосов
/ 10 апреля 2019

Когда я запускаю свой код с поиском тестового примера ("mississippi", "sip"), он выводит "sippi", а затем "false" ниже.Меня это смутило, потому что я предполагал, что будет напечатано «true».

Я попытался удалить оператор return в теле if, но получил ошибку

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 ]

3 голосов
/ 10 апреля 2019

Вы не используете логическое значение, возвращаемое рекурсивными вызовами 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 голос
/ 10 апреля 2019

Вы рекурсивно двигаетесь вниз, пока не получите совпадение для "sip" и не распечатаете "sippi". Внутренний вызов затем возвращает истину. Это выводит вас на следующий уровень после вызова find (), и вы снова выводите «sippi». Этот вызов затем возвращает ложь. Это выводит вас на следующий уровень, после вызова find (), и там вы распечатываете «isippi». Затем этот вызов возвращает false ... и т. Д.

Я не вижу ничего, что выводит "true" или "false".

Это, похоже, распространенное недопонимание рекурсии. Люди получают часть вложенного вызова, но не вложенный возврат. Каждый возврат выходит только из текущего уровня вызова, а не из всего стека вызовов.

...