我正在嘗試學習 Java 中的遞回。我正在嘗試列印從 A 到 Z 的英文字母。但是當我運行代碼時,會列印出一些不受歡迎的東西。我的 AZ 角色怎么了?
代碼如下:
public class Recursion_Maharaj {
public static void main(String[] args) {
System.out.println("Recursion...");
char[] alphabet = alphabets('A');
for (char c :alphabet) {
System.out.println(c);
}
}
static char[] alphabets(char S){
int start = (int) S; // ASCII = 65
int end = 'Z';// ASCII = 90
char character;
char[] ret = new char[26];
if (start <= end){
start ;
character = (char) start;
ret = alphabets(character);
}
return ret;
}
}
輸出是一些不受歡迎的字符。
我犯了什么錯誤?
uj5u.com熱心網友回復:
讓我們分析一下您的代碼。讓我們從最后一次呼叫 method開始alphabets。方法引數的值,即S,將為[(即ASCII 表中Zif之后的字符),因此條件為假,因此該方法將回傳一個由 26 個元素組成的陣列,其中每個元素都是空字符,即 ASCII 碼為零的字符——因為在這行代碼中:
char[] ret = new char[26];
Java 將隱式地將每個陣列元素初始化為零。
所以最后一次呼叫回傳一個空字符陣列到第二次最后一次呼叫,也就是這行代碼:
ret = alphabets(character);
因此,倒數第二個呼叫也回傳一個空字符陣列——依此類推,直到您回傳第一個呼叫,該呼叫在這行代碼中回傳空字符陣列:
char[] alphabet = alphabets('A');
因此,當您列印 的內容時alphabet,它會列印出 26 個空行。實際上它列印了 26 行,每行顯示一個空字符。如果將for回圈更改為以下內容,它將列印 26 個零。
for (char c :alphabet) {
System.out.println((int) c);
}
您需要使陣列成為方法的引數之一,alphabets并在方法體alphabets中為該陣列的元素賦值。實際上,我建議使用 aList而不是陣列List,因為 a 與陣列不同,它沒有固定大小,并且您事先無法知道將添加多少個字母到List. 如果您的初始呼叫更改為:
char[] alphabet = alphabets('Y');
那么應該退回多少封信呢?不是26,對吧?
這是我對您的代碼的重寫:(
請注意,這char是一個原語,您不能擁有 a Listof 原語。)
import java.util.ArrayList;
import java.util.List;
public class Recursion_Maharaj {
private static void getLetters(List<Character> letters, char letter) {
if (letter <= 'Z') {
letters.add(letter);
getLetters(letters, (char) (letter 1));
}
}
public static void main(String[] args) {
System.out.println("Recursion...");
List<Character> list = new ArrayList<>();
getLetters(list, 'A');
for (Character c : list) {
System.out.println(c);
}
}
}
運行上面的代碼會列印以下內容:
Recursion...
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
如果我將初始呼叫更改為:
getLetters(list, 'Y');
那么輸出是:
Recursion...
Y
Z
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515669.html
標籤:爪哇递归
上一篇:列印不同深度的陣列
