2016-01-22 121 views
0

我無法將此遞歸方法(recP)轉換爲使用循環(itP)的遞歸方法。將遞歸方法更改爲迭代

public class Main { 

    public static int recP(int n) { 

     if (n <= 2) 
      return 1; 
     else 
      return (recP(n - 3) * recP(n - 1)) + 1; 

    } 

    public static int itP(int n) { 

     if (n <= 2) 
      return 1; 
     else 
      //do something 


    } 

    public static void main(String[] args) { 

     System.out.println(Main.recP(6)); //returns 9 
     System.out.println(Main.itP(6)); //should return 9 

    } 

-

如果我是用手工做到這一點,(6)利用遞推公式計算RECP,我會列出工作的步驟和細節丟失填寫,我跟着去了:

P6 = (P3 X P5)+ 1 = (2 X 4) + 1 = 9 
P3 = (P0 X P2) + 1 = 2 
P5 = (P2 X P4) + 1 = (1 X P4) + 1 = 4 
P4 = (P1 X P3) + 1 = (1 X 2) + 1 = 3 

-

我知道,一個循環應該在方法的其他部分去,但我不知道這個循環將如何工作。找不到計算recP/itP的公式。 希望能得到一些指導。

+0

爲什麼你有*完全不知道*如何這會工作?你能用英語重述這個問題嗎?你有什麼嘗試? – dcsohl

+0

恭敬地,除非我和你說的英文不同,我想我已經充分解釋了我正在嘗試將遞歸方法recP()重寫爲迭代方法,我已經開始使用它作爲itP()。我很困惑我將如何去編寫一個返回相同值的循環,但不使用任何形式的遞歸。 – ak1652

+0

我的不好,我的意思是要求你用英文描述*解決方案*。如果你不得不用鉛筆和紙來計算它,你會怎麼做? – dcsohl

回答

1

你需要「記住」你計算的最近三個值,並用它們來計算電流:

public static int itP(int n) { 
    if (n <= 2) { 
     return 1; 
    } 

    int n3 = 1; 
    int n2 = 1; 
    int n1 = 1; 

    for (int i = 3; i <= n; i++) { 
     int m = n3 * n1 + 1; 
     n1 = n2; 
     n2 = n3; 
     n3 = m; 
    } 
    return n3; 
} 
+0

對,這很有道理,謝謝! – ak1652

+0

這顯然是一項家庭作業......這正是我試圖在沒有爲他們做家庭作業的情況下轉向。 – dcsohl

+0

不,這不是一項家庭作業,而是一本沒有提供解決方案的書籍。這就是說你完全正確,指導和提示更好。 – ak1652