2014-11-23 69 views
0

我正在使用遞歸方法來處理某些矩陣。問題是:當遞歸返回時,這個矩陣的值不能從堆棧中恢復(返回前後的值是相同的)。遞歸:函數無法從堆棧中恢復值

我試圖做一些事情的looooot,但沒有解決它。順便說一句,我已經試圖一步一步地將我的程序與其他人進行比較(從朋友和小作品精心製作),直到遞歸,兩個程序都是平等的。遞歸背影后,只有我的基質是錯誤的...

這裏有一塊我的代碼:

public static Integer [][] Complement(Integer[][] M){ 

    if (OneRowNotEmpty(M)) { // just one row of matrix are different then 0s 
     return changeSignalLine(M); 
    } 

    else { 
     int row = DefineLineToErase(M); 
     matrix = Complement(zeraLinha(row, M); // recursion 
     dosomething(); 

    } 

    /* make some stuffs, but at this point my M are wrong*/ 

    return finalMatrix; // just for illustrate. this matrix are built in lines after recursion 
    } 

這是用一個例子更容易: 在「A」級,我的基質是:

[ 00 00] (matrix on level "A" of recursion) 
M = [ 11 10] 
    [ 11 01] 

讓我們假設我的擦除行是第二,所以:

[ 00 00] (matrix on level "B" of recursion) 
M = [ 00 00] 
    [ 11 01] 

此時,上水平 「B」,則該函數OneRowNotEmpty(M)爲真,所以它返回下列矩陣:

[ 00 00] (til' here, everything is fine) 
M = [ 00 00] 
    [-11 -01] 

此時,遞歸必須返回到「A」級別的矩陣M並保持計算(doSomething()),但它會返回到級別「B」的矩陣M並繼續計算(doSomething())。問題是:這種計算髮生在錯誤的矩陣中。

這就像遞歸的return語句不存在一樣。我無法理解這一點。

有什麼想法?這是一個難以解釋的問題,但我嘗試過。任何問題,問我。

非常感謝。

+0

你可以發佈編譯的代碼嗎? – Fildor 2014-11-23 21:40:42

+0

http://www.codeshare.io/OUa2M(註釋在葡萄牙語中,錯誤發生在函數deMorgan()之後 - 在我的例子中,deMorgan()等同於changeSignal(),你可以在該行中放置一個斷點) 。 – misc 2014-11-23 21:45:46

+0

遞歸按預期工作。如果您只想在入門級進行一些計算,則需要跟蹤深度。 – Fildor 2014-11-23 21:45:48

回答

0

有兩種可能性。

  1. 將你的函數分成調用遞歸函數和計算結果。

像這樣

Integer [][] complement (Integer[][] m){ 
    Integer[][] recurResult = recursiveComplement (m); 
    // recursion has finished 
    return doSomething (recurResult); 
} 

Integer[][] recursiveComplement(Integer[][] m){ 
    if(endCondition(m)) return m; // Checks if Recursion shall be ended. 
    Integer[][] levelM = doComplementTransform(m); 
    return recursiveComplement(levelM); 
} 

在recursiveComplement去遞歸部分。

  1. 添加您在每次自調用(計算(M,深度+1))中增加的深度參數。如果調用後深度爲0,則您再次進入入門級別。
+0

不知道是否理解正確。這是我的代碼有問題的部分:http://www.codeshare.io/OUa2M。當遞歸返回並且PC移動到第15行時,F與第14行中調用的不一樣。我不知道如何在調用P和N之前保持F完整(我已經嘗試複製F並在第15行中使用此副本,但它只適用於遞歸的第一級)...非常感謝您的耐心! :) – misc 2014-11-23 22:15:46

+0

這是預期的行爲。你告訴F是下一個遞歸級別的結果。你期望什麼?作爲旁註,如果狀態爲空,則不返回任何內容。 – Fildor 2014-11-24 06:01:38

+0

非常感謝。最後解決它。我只是把一個深度變量來控制遞歸,並在我的算法中進行了一些修改,它的工作原理。 – misc 2014-11-24 12:00:13