Ходить по рекурсивному коду, чтобы сторнировать введенную пользователем строку

Поэтому я пишу для себя рекурсивный код без весенних каникул. В настоящее время я пытаюсь сделать рекурсивную функцию, которая обратит введенную строку от пользователя. У меня есть это на данный момент, и это работает.

import java.util.Scanner;

public class Recursion {

    public static void main(String args[]) {
        String userStr = " ", userAlt = " ";
        int position = 0, length = userStr.length() - 1;
        @SuppressWarnings("resource")
        Scanner scan = new Scanner(System.in);

        System.out.println("Please enter a string.");
        userStr = scan.nextLine();

        userAlt = reverse(userStr);
        System.out.println("
" + userStr + " is... 
" + userAlt + " backwards!");

    }

    public static String reverse(String userStr) {
        if(userStr.isEmpty()) {
            return userStr;
        }
        else {
            return reverse(userStr.substring(1)) + userStr.charAt(0);
        }
    }
}

Хотя я не уверен, как работает это возвращаемое утверждение, потому что оно сбивает меня с толку. Я бы подумал, что постоянный вывод будет просто первой буквой в конце строки, не полностью обращая ее, но она работает правильно задним числом. Я надеялся, что кто-то может мне помочь, я не думаю, что мне чего-то не хватает в методе substring (). Заранее спасибо!

Например: если введенная строка была «пружиной», вывод userAlt будет «gnirps», как и должно быть. Но почему?

редактировать: извините за бесполезные объявления кода int position & length, я работал над другим способом решения этой проблемы, натолкнулся на этот путь, но никогда не удалял код.

Всего 1 ответ


В следующем операторе return есть две части:

return reverse(userStr.substring(1)) + userStr.charAt(0)

Вторая часть, userStr.charAt(0) - это та, которая собирается в конечный результат.

Первая часть reverse(userStr.substring(1)) предназначена для рекурсивного вызова функции с новым аргументом userStr.substring(1) . Эта часть предназначена для того, чтобы просто вызывать функцию до тех пор, пока в параметре не останется другого символа, или, другими словами, продолжать работать до тех пор, пока все символы не будут собраны в окончательный результат.

Когда вы думаете о рекурсивном вызове, подумайте о стеке (который является последним первым полученным). В этом смысле, поскольку O будет последним символом, который будет помещен в стек, он будет первым символом, который будет отсутствовать.

Самый простой способ понять, как работает рекурсивный метод, - это отслеживать значения аргументов и параметров, например:

import java.util.Scanner;

public class Recursion {

    public static void main(String args[]) {
        String userStr = " ", userAlt = " ";
        int position = 0, length = userStr.length() - 1;
        @SuppressWarnings("resource")
        Scanner scan = new Scanner(System.in);

        System.out.println("Please enter a string.");
        userStr = scan.nextLine();

        userAlt = reverse(userStr);
        System.out.println("
" + userStr + " is... 
" + userAlt + " backwards!");

    }

    public static String reverse(String userStr) {
        if (userStr.isEmpty()) {
            System.out.println("userStr when it userStr is empty: " + userStr);
            return userStr;
        } else {
            System.out.println("userStr when userStr is not empty: " + userStr);
            System.out.println("userStr.substring(1) when userStr is not empty: " + userStr.substring(1));
            System.out.println("userStr.charAt(0) when userStr is not empty: " + userStr.charAt(0));
            return reverse(userStr.substring(1)) + userStr.charAt(0);
        }
    }
}

Пример прогона:

Please enter a string.
hello
userStr when userStr is not empty: hello
userStr.substring(1) when userStr is not empty: ello
userStr.charAt(0) when userStr is not empty: h
userStr when userStr is not empty: ello
userStr.substring(1) when userStr is not empty: llo
userStr.charAt(0) when userStr is not empty: e
userStr when userStr is not empty: llo
userStr.substring(1) when userStr is not empty: lo
userStr.charAt(0) when userStr is not empty: l
userStr when userStr is not empty: lo
userStr.substring(1) when userStr is not empty: o
userStr.charAt(0) when userStr is not empty: l
userStr when userStr is not empty: o
userStr.substring(1) when userStr is not empty: 
userStr.charAt(0) when userStr is not empty: o
userStr when it userStr is empty: 

hello is... 
olleh backwards!

Теперь вы можете видеть, как формируется 'o' + 'l' + 'l' + 'e' + 'h' = "olleh" .