簡體   English   中英

基本的遞歸回溯(機器人2D尋路)

[英]basic recursive backtracking (robot 2D pathfinding)

我正在處理一個練習問題,被卡住了。 問題要求編寫一種方法,該方法使用兩個整數x和y來打印,以通過重復使用以下三個動作之一來打印從(0,0)到(x,y)在2D平面上傳播的所有解:

  • 向右移動1(E)
  • 上移1(N)
  • 向右移動1和向上移動1(NE)

這些是一些示例調用:

  • 致電:travel(2,1)
  • 輸出:EEN // ENE // E NE // NEE // NE E

我寫了以下代碼:

public void travel(int x, int y) {
    if (x == 0 && y == 0) {
        System.out.println();
    } else if (x > 0 && y > 0) {
        System.out.print("E ");
        travel(x-1, y);
        System.out.print("N ");
        travel(x, y-1);
        System.out.print("NE ");
        travel(x-1, y-1);
    } else if (x > 0 && y == 0) {
        System.out.print("E ");
        travel(x-1, y);
    } else if (y > 0 && x == 0) {
        System.out.print("N ");
        travel(x, y-1);
    }
}

調用上述方法將導致以下代碼:

  • 調用:travel(2,1);
  • 輸出:EEN // NE // NE // NEE // NE E

我知道,對於此示例調用,問題在於E在需要E的三種不同情況下僅被打印一次,因為在調用后續遞歸方法之前已打印了E。

我想通過在旅行方法的每次調用中附加System.out.print命令來解決此問題(不確定這是正確的方法)。 這樣,每當調用travel方法時,每次都會用第一個字母打印結果。 但是,由於該方法不返回任何內容,因此無法在print語句中插入該方法。 這是我長期困擾的地方。

關於如何從這里出發的任何建議將不勝感激。

遞歸構建解決方案時,通常將部分構建的解決方案作為參數傳遞給遞歸調用。

public void travel(int x, int y, String path) {
    if (x == 0 && y == 0) {
        System.out.println(path);
    } else if (x > 0 && y > 0) {
        travel(x-1, y, path + ' E');
        travel(x, y-1, path + ' N');
        travel(x-1, y-1, path + ' NE');
    } else if (x > 0 && y == 0) {
        travel(x-1, y, path + ' E');
    } else if (y > 0 && x == 0) {
        travel(x, y-1, path + ' N');
    }
}

看看我們如何構建路徑-並讓函數調用處理記住我們在搜索中的位置的復雜性? 這也具有簡化代碼的好特性,因為每個路徑只對System.out.println一次調用。

暫無
暫無

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

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