[英]Java recursively print array in reverse
該數組是一個字符串數組。 數組是{"hello", "how", "are", "you", "?"}
它有點工作,但輸出混合了最后 2 個元素,當我運行我的程序時,輸出結果是you ? are how hello
you ? are how hello
,應該是? you are how hello
? you are how hello
。
我輸入了一個打印語句來查看我的左和右是什么以及它們是否切換,但這沒有幫助,因為它們只打印出起始值而沒有其他任何內容。
為什么打印出來不對? 不是在做遞歸嗎?
這是我的方法。 它必須通過分而治之的方式來完成。
public void outrev() {
outrev(0, a.length - 1);
}
private void outrev(int left, int right) {
System.out.println("left a[" + left + "] is " + a[left]);
System.out.println("right a[" + right + "] is " + a[right]);
int mid;
if (left > right) {
//do nothing
}
else if (left == right) {
System.out.print(a[left]);
}
else {
mid = (left + right) / 2;
outm(mid + 1, right);
System.out.print(a[mid] + " ");
outm(left, mid - 1);
}
}
public void outrev()
{
List<String> arr = Arrays.asList(a);
outrev(arr);
}
private void outrev(List<String> arr)
{
System.out.println(arr.get(arr.size() - 1));
if(arr.size() != 1){
outrev(arr.subList(0, arr.size() - 1));
}
}
你必須導入
導入 java.util.Arrays; 導入 java.util.List;
不知道這是否違反了你的家庭作業規則。 注意 outrev 調用自身,但一旦列表長度為一項就停止調用自身? 這是遞歸的主要租戶,即調用自身並具有終止條件的函數。 在您的原始代碼中,outrev 並沒有真正自稱; 但是,在一種情況下,您正在重載 outrev,但這與遞歸不同——除非您未定義的 outm 旨在調用 outrev。
您還應該檢查此程序以確保列表不為空,因為您的老師可能會將它扔給您,並且在這種情況下代碼會失敗。
請記住,對於遞歸,最好從以下方面考慮:1) 當我有零個項目時該怎么辦。 2) 當我有一件物品時該怎么辦。 3) 如何處理我的列表包含多個項目的所有其他情況。
您對遞歸“分而治之”算法有正確的想法。 基本思想是以下操作:
您通過打印“中間”讓自己變得困難。 相反,您應該僅在達到終止條件時才進行打印,也就是說,當您只有 1 個元素而無法將數組分成兩半時。
此外,您的代碼包含方法outrev()
和outrev(int left, int right)
定義,但沒有outm(int left, int right)
定義,因此您發布的代碼無法編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.