【问题标题】:Walking through recursive code to reverse an user inputted String遍历递归代码以反转用户输入的字符串
【发布时间】:2020-03-25 20:24:39
【问题描述】:

所以我在春假期间为自己编写了一些递归代码,没有任何目的。目前我正在尝试制作一个递归函数,它将反转用户输入的字符串。我现在有这个,它有效。

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);
        }
    }
}

虽然,我不确定这个 return 语句是如何工作的,因为它让我感到困惑。我认为恒定输出只是字符串末尾的第一个字母,没有完全反转它,但事后看来它可以正常工作。我希望有人可以帮助我,我认为 substring() 方法没有遗漏任何东西。提前致谢!

例如:如果输入的字符串是“spring”,那么 userAlt 的输出应该是“gnirps”。但是为什么呢?

编辑:对于 int 位置和长度的无用代码声明感到抱歉,我正在研究一种不同的方法来解决它,遇到这种方式然后从未删除过代码。

【问题讨论】:

    标签: java string eclipse recursion


    【解决方案1】:

    下面的return声明有两部分:

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

    第二部分,userStr.charAt(0) 是收集到最终结果中的部分。

    第一部分,reverse(userStr.substring(1)) 是用一个新参数userStr.substring(1) 递归调用函数。这部分只是为了保持函数被调用,直到参数中没有其他字符,或者换句话说,保持函数运行,直到所有字符都收集到最终结果中。

    当您想到递归调用时,请想到堆栈(即后进先出)。从这个意义上说,由于O 将是最后一个被压入堆栈的字符,因此它将是第一个被压出的字符。

    了解递归方法如何工作的最简单方法是跟踪 arguments and parameters 的值,例如

    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" 是如何形成的。

    【讨论】:

    • 因此,除了第一个字符之外,将 userStr 中的所有内容进行子串化,以将该 charAt(0)(向后打印的字符串中的最后一个字符)返回到 userAlt,然后每次递归调用它在 userAlt 中将前一个 charAt 向上移动?还是我没有正确跟随?
    • 我已经用更多解释更新了我的答案。我希望,它有帮助。如有任何疑问/问题,请随时发表评论。
    • 哦,好吧,所以我对返回语句中自己的编码感到困惑。因此,传递的字符是 userStr 的第一个字符,在本例中为“H”,然后将其放入 userAlt 并通过递归调用将其推回索引(0 到 1...1 到 2... ETC。)?我这么想的唯一原因是因为字符串是一个字符数组,所以我不确定添加 charAt(0) 是在 userAlt 的第 0 个元素处添加它,还是从 userStr 中获取第 0 个元素。也提前感谢您的帮助!递归一直让我很困惑。
    • 我当然会!只是好奇,这就是 String 和 charAt 在幕后的工作方式,对吗?
    • 您可能错过了我回答的以下部分:当您想到递归调用时,请想到堆栈(即后进先出)。从这个意义上说,由于o 将是最后一个被压入堆栈的字符,所以它将是第一个被压出的字符。。我希望,现在应该很清楚了。如果有任何进一步的疑问/问题,请随时发表评论。
    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 2020-10-09
    • 2012-03-27
    • 2017-07-20
    • 2017-06-11
    • 2021-12-15
    相关资源
    最近更新 更多