繁体   English   中英

如何递归打印字符串中的每个字符 function

[英]How to recursively print out each character one at a time in a String function

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

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

我一直在练习使用 Int 函数进行递归,并且一直在慢慢尝试使用 String 函数来简化理解递归的方式。 我对如何准确调用 function 来增加或减少感到困惑。 使用 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));
}

预期的 output 应该是:

H
i

但是当前的 output 是:

H
H

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

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

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

输出

H
i

为了创建递归方法,您必须实现递归逻辑的两个关键部分: 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);
    }

递归 function 从同一个 function 中调用自身。 function 最终需要有办法逃脱,否则会出现 StackOverFlowError。

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

在您的代码中: 1.first cycle:str is "Hi";then print "H";then str.substring(0, str.length()-1) is H 2.second cycle:str is "H";then返回并结束递归并且什么都不做

修复你的代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM