簡體   English   中英

Java以遞歸方式反向打印數組

[英]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. 將數組一分為二:
  2. 遞歸打印右半部分
  3. 遞歸打印左半部分

您通過打印“中間”讓自己變得困難。 相反,您應該僅在達到終止條件時才進行打印,也就是說,當您只有 1 個元素而無法將數組分成兩半時。

此外,您的代碼包含方法outrev()outrev(int left, int right)定義,但沒有outm(int left, int right)定義,因此您發布的代碼無法編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM