2015-12-03 142 views
2

最近我一直在尋找遞歸形式的數字(用戶輸入,正整數)的斐波那契和,例如(輸出是): 9 = 8 + 1 14 = 13 + 1 30 = 21 + 8 + 1 等等。 到目前爲止,我已經做了遞歸函數來計算實際的斐波那契數(在9總和,如8和1),它看起來像這樣:斐波那契Sum in(Java)

static long[] f = new long[50]; 

static long fib(int n) { 
    if (n <= 1) { //base case 
     return 1; 
    } 
    if (n < f.length) { 
     if (f[n] != 0) { 
      return f[n]; 
     } 
     return f[n] = fib(n - 1) + fib(n - 2); 
    } 
    return fib(n - 1) + fib(n - 2); 
} 

我分配給我這是一個暗示:

提示: 重新定理爲 n = fj +(n - fj) 這提示了一個遞歸解決方案。

,並用這一點,我已經目前想出這個:

static void fibSum(int n) 
{ 
    System.out.print(n + " = "); 
    for(int i = 0; i >= 0 ; i++) 
    { 
     if(n - (fib(i)) == 0) 
     { 
      System.out.println(fib(i)); 
     } 
     else if(n < (fib(i)) && n > (fib(i-1)))    
     { 
      System.out.println(fib(i-1) + " + "); 
     } 
    } 
} 

我的輸出變爲儘可能[進入例如,9作爲用戶輸入]「9 = 8 +」,和與該對於所有正在閱讀這些內容的人(並且感謝你獲得這麼多!),我的問題是爲什麼我沒有得到分解總和中的最後一個數字(1),並且我的解決方案被認爲是re​​curisve,因爲它實際上並沒有遵循我在過去的例子中看到的格式,也沒有遵循我寫的fib()方法。我不知道如何實現通過這種格式打印加號。 這裏是我的參考主要方法:

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Please enter an integer number: "); 
    int n = scan.nextInt(); 
    fibSum(n); 

回答

1

你似乎在你的函數fibSum各種問題:

  1. 你的循環沒有結束。 (雖然我是積極的,但增加我)
  2. 您可以將:fib(i)存儲在for循環中以避免多次計算。
  3. 您不處理您的if/else條件的每個案例。

例:

n = 2. 
fib(0) = 1 
if(2 - 1 == 0) => false 
if(2 < 1 && 2 > fib(-1)) => false && error. 
// Displays nothing. Should display: 2 = 1 + 1 
+0

我認爲由於fib函數的基礎case n <= 1,它處理諸如fib(-1)之類的情況並將其返回爲1?也許我錯了,目前正試圖通過你提到的事來嘗試找到並修復它們。 – Dan

0

使用while循環終於想通了,這一次。無論我嘗試修復for循環多少次,我遇到了我的輸出問題,所以我使用了一個布爾變量,並且一旦我達到n = 0時它就會變成false。