【问题标题】:How to recursively print out each character one at a time in a String function如何在字符串函数中一次打印出每个字符
【发布时间】:2026-02-03 23:05:01
【问题描述】:

我试图通过使用字符串函数来更好地理解递归特性。我正在尝试创建一个函数,该函数一次递归打印一个字符,直到堆栈到达字符串的末尾。例如,输入如下所示:

String str = "Hi";
//Output:
H
i

我一直在练习使用 Int 函数进行递归,并且一直在慢慢尝试使用 String 函数来简化理解递归的方式。我对如何准确调用函数来增加或减少感到困惑。借助 Int 函数,使用这种方法很容易。

int function(int N){
    return function(N+1);
}

这是我当前的代码。

String str = "Hi";

public String forward(String str){
    if(str.equals(null) || str.length()<2) return str;

    System.out.println(str.charAt(0));
    return forward(str.substring(0, str.length()-1));
}

预期的输出应该是:

H
i

但是当前的输出是:

H
H

感谢您的时间和耐心,非常感谢您提供任何帮助或指导。

【问题讨论】:

  • 小心你如何应用递归。像任何工具一样,它有特定的用途,在错误的地方使用它会导致问题。如果您想尝试递归,请使用递归问题,例如二叉树。打印字符串是递归的可怕应用。

标签: java string recursion


【解决方案1】:

因为您每次都使用相同的String 进行递归。您实际上想跳过第一个字符。而且你不需要返回任何东西。方法应该是static。不要使用Object.equals(null) - 这会给你一个NullPointerException null。类似的,

public static void forward(String str) {
    if (str == null || str.isEmpty()) {
        return;
    }
    System.out.println(str.charAt(0));
    forward(str.substring(1));
}

输出

H
i

【讨论】:

    【解决方案2】:

    为了创建递归方法,您必须实现递归逻辑的两个关键部分:BASE CASERECURSIVE CASE

    基本情况 - 由结果已知的输入表示 进步。在这种情况下,它是字符串的结尾。

    递归案例 - 是您的逻辑所在的位置,也是进行递归调用的位置。

        public static void main(String[] args) {
            printStr("test");
        }
    
        public static void printStr(String str) {
            if (str.isEmpty()) return;
            helper(str, 0);
        }
    
        private static void helper(String str, int i) {
            if (i >= str.length()) return;
            System.out.println(str.charAt(i));
            helper(str, i + 1);
        }
    

    【讨论】:

      【解决方案3】:

      递归函数在同一个函数中调用自身。该函数需要有一种最终逃逸的方法,否则会出现 *Error。

      public static void main(String[] args) {
        printStr("Hi");
      }
      
      private static String printStr(String s) {
        if (s == null || s.length() == 0) {
          return null;
        }
        System.out.println(s.charAt(0));
        return s.length() >= 1 ? printStr(s.substring(1)) : null;
      }
      

      【讨论】:

        【解决方案4】:

        在您的代码中: 1.第一个循环:str为“Hi”;然后打印“H”;然后str.substring(0, str.length()-1)为H 2.第二个循环:str为"H";然后返回结束递归,什么都不做

        修复你的代码:

           public static String forward(String str) {
            if (str.length() == 0) {
                return null;
            }
            System.out.println(str.charAt(0));
            return forward(str.substring(1));
        }
        

        【讨论】: