2011-10-17 55 views
-4

這是一個有限狀態機:如何使用堆棧將以下代碼替換爲非遞歸?

private int recursive(int rc, int pc, int sc) { 
    for (;;) { 
     Instruction actual = program[rc][pc]; 
     switch (actual.type) { 
      case FIRST: 
       if (sc >= input.length || input[sc] != actual.c1) return -1; 
       pc++; sc++; 
       continue; 
      case SECOND: 
       pc = actual.n1; 
       continue; 
      case THIRD: 
       int result = recursive(rc, actual.n1, sc); 
       if (result != -1) return result; 
       pc = actual.n2; 
       continue; 
      case FOURTH: 
       result = recursive(actual.n1, 0, sc); 
       if (result == -1) return -1; 
       pc++; sc = result; 
       continue; 
      case FIFTH: 
       if (sc == input.length) return sc; 
       return -1; 
     } 
     return -1; 
    } 
} 

感謝您的幫助。

+2

這真的不是一個「爲我寫代碼」的網站。嘗試一些事情,然後回來具體問題。 – retrodrone 2011-10-17 12:59:34

+0

我很抱歉,但對我來說這是一個非常難的問題 – 2011-10-17 13:03:41

回答

1

想想遞歸。當你遞歸地調用方法時,你實際調用方法並在某處存儲以前調用同一方法的狀態。你在哪裏存儲這個狀態?答案是「疊加」。但是當你使用遞歸調用時,系統會爲你管理堆棧。

所以,你必須自己管理它。這意味着以下內容。在第一個方法調用之前創建堆棧。改變方法的簽名:它應該接受棧作爲參數。堆棧應該包含你的狀態。不檢查你的代碼,它可以是原始的或複雜的對象。如果你需要複雜的對象創建你自己的類狀態,那將包含所有需要的信息。

我希望這已經足夠。祝你好運!