2016-10-18 103 views
-1

尋找從學校的一個java任務的幫助,我想創建一個遞歸算法,解決了以下的難題:遞歸函數不正確的輸出

給定一個起始位置和長度爲n的由n-1陽性的數組與陣列爲0的最後一個位置編號,例如:

{4 8 5 2 3 5 1 6 4 0} 

遊戲規則:

向右等於值@起始從起始位置移動 的位置,重複,直到你不能再移動到右邊。

一旦你不能再向右移動,向右移動 向右移動,一旦你不能移動到左邊的 。

現在繼續重複這個過程。

當您移動的0

的 列保持價值的最後一個位置的難題將得到解決,否則這一難題是無法解決的。

  1. 在上面的例子,如果我們開始@第一位置是「4」
  2. 我們向右移動4位結束了@位置5保持值3
  3. 我們向右移動3結束了@ 8位容值6
  4. 位置移動到左側的6個位置結束了@ 2位容值8
  5. 我們向右移動8個位置@最後一個位置保存值結束了0
  6. 因爲我們已經移動到陣列的最後一個位置,這個難題是可以解決的。

我必須使用遞歸來解決這個難題,我已經提出了算法,但即使拼圖是可解的,我也會得到錯誤的輸出。

這裏是我的算法:

static boolean rightWing(int[] A, int i) //i = starting position 
{ 

    int left=i; 
    int right=A.length-i-1; 

    if (A[i]<right) 
    { 
     i=i+A[i]; 
     rightWing(A, i); 
    } 
    if (A[i]<left) 
    { 
     i=i-A[i]; 
     rightWing(A,i); 
    } 

    if (right==A[i]) 
     return true; 
    else 
     return false; 

} 
+0

這是一個讓您熟悉使用調試器的機會,它將成爲您軟件開發中最寶貴的技能。 https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – David

回答

0

試試這個,

static boolean rightWing(int[] A, int i) //i = starting position 
{ 

    int left=i; 
    int right=A.length-i-1; 

    if (A[i]<right) 
    { 
     i=i+A[i]; 
     return rightWing(A, i); 
    } 
    if (A[i]<left) 
    { 
     i=i-A[i]; 
     return rightWing(A,i); 
    } 

    if (right==A[i]) 
     return true; 
    else 
     return false; 
} 

注意遞歸調用之前右翼的回報。你需要這個,否則你的方法總會返回第一個調用的權利== A [i]的結果。

+0

非常感謝穆斯塔法,在你的建議後,我得到了一些輸入的代碼工作。除了你的建議,我不得不調整幾個控制流量表(A [i] = 0) –

+0

非常感謝穆斯塔法,在你的建議後,我得到了代碼爲一些輸入工作。除了你的建議之外,我必須將上面的控制流程聲明調整爲以下內容:(A [i] <= right && A [i]!= 0)(A [i] <= left && A [i]!= 0) –

+0

通過添加return語句,最後一件事是代碼現在是遞歸的嗎?如果沒有return語句,我認爲每次遞歸調用都必須在調用結束時返回操作的掛起操作。但是,通過添加return語句,我們實際上返回了遞歸函數。那是對的嗎? –