2015-12-05 97 views
1

我最近給出一個項目如下:(Java)的遞歸函數:使用n-1和n + 1個

遞歸關係: X(N)= X(N + 1) - 2(正1)其中x(0)= 1和x(2)= 3 編寫一個程序,用戶輸入一個數字n,並輸出如上所示的x的第n個值。

到目前爲止,我有此方法(我是很新的,並用[到目前爲止]遞歸非常糟糕)

public class x 
{ 
    static int x(int n) 
    { 
     if(n <= 1) 
     { 
      return 1; 
     } 
     if(n == 2) 
     { 
      return 3; 
     } 
     else 
     { 
      return x(n+1) - 2*(x(n-1)); 
     } 
    } 

,並提示用戶爲n的輸入一個簡單的main方法,然後打印在上述方法的結果:

public static void main(String[]args) 
    { 
     Scanner scanner = new Scanner(System.in); 
     System.out.println("Enter a number: "); 
     int n = scanner.nextInt(); 
     System.out.println(x(n)); 
    } 

從分配,我計算是x(1)= 1。[正在我給定x(0)= 1和x(2)= 3 ]:

x(n) = x(n+1) - 2(x(n-1)) 
x(1) = x(2) - 2(x(0)) 
x(1) = 3 - 2(1) 
x(1) = 3 - 2 
x(1) = 1 

這給我帶來了在上面的靜態方法X表示我的基本情況,

if(n <= 1) // because 0 and 1 each return 1 
{ 
return 1; 
} 
if(n == 2) // simply because 2 returns 3 
{ 
return 3; 
} 

當我跑我有什麼,節目給我的錯誤:

Exception in thread "main" java.lang.StackOverflowError 
    at x.x(x.java:21) 
Java Result: 1 

線21是在x方法的else子句中返回語句:

return x(n+1) - 2*(x(n-1)); 

我不知道我可以改變它來修復它。我嘗試將它重新表示爲x(n + 1)-x(n-1)-x(n-1),但它仍然給我帶來相同的錯誤。我不知道基本情況是否無效,因此不允許函數正常運行,或者只是我所做的返回語句是錯誤的。 我也試着寫出來,就好像x(5)調用x(4)調用x(3)一樣,就像我的筆記所顯示的那樣,但是我得出的問題是關於在同一函數中有n + 1和n-1聲明,所以我認爲我只是以錯誤的方式去做。 對此的任何指導都非常感謝!

+0

重複關係不終止。要麼任務/項目要求不正確(或者他們構成了一個技巧問題),或者您已經錯誤地閱讀和轉錄了它。 –

回答

1

遞推關係被定義爲前一條款的功能。 所以,你必須重新定義你的遞歸關係,

x(n) = x(n+1) - 2x(n-1)

x(n+1) = x(n) + 2x(n-1)

x(n) = x(n - 1) + 2x(n-2)

使用上述公式來實現與底座的情況下x(0) = x(1) = 1, x(2) = 3的算法。

+0

嗨,謝謝你的回覆。我只有一個問題,那就是你的陳述中的數學問題。是否有某種數學函數關係可以改變x(n + 1)= x(n)+ 2x(n-1)?我在數學方面不是很有經驗,所以我只想在需要解釋的情況下清楚這個概念。 – Dan

+0

其實,我再讀幾遍這個東西..它只是減法和加法!非常感謝! – Dan

2

問題是因爲它是永無止境的循環.... X(N)= X(N + 1) - 2(N-1)

您增加N,即 爲

X(0)= 1

X(1)= X(2) - 2×(0)

X(3)= X(4) - 2×(2).. ..

它使要去,因爲是X(N + 1)無上限....

請檢查您是否不會錯過從那裏遞歸將終止它的邊界條件。

+0

感謝您的回覆!有助於我對遞歸的理解,因爲你說過它是如何遞增的。非常感激。 – Dan