簡體   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