Ходить по рекурсивному коду, чтобы сторнировать введенную пользователем строку - PullRequest
0 голосов
/ 25 марта 2020

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

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("\n" + userStr + " is... \n" + 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", как и должно быть. Но почему?

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

1 Ответ

1 голос
/ 25 марта 2020

В следующей инструкции 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("\n" + userStr + " is... \n" + 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" сформирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...