2013-02-12 82 views
-1

我一直在玩一些代碼今晚,我編碼了一個非常簡單的算法,我認爲這是斐波那契遞歸和大數字的一個非常好的解決方案。我想知道你們想想看,如果你有與我們做的更好,共享任何貢獻......看看代碼波紋管用於大數字的Java遞歸斐波納契實現

public class RecursiveFibonacci { 

    public void calculateFib(long first, long next, long counter, int n) { 
     if(counter == n) { 
      return; 
     } 
     counter++; 
     if(first == 0 && next == 0) { 
      System.out.println("0"); 
      calculateFib(0, 1, counter, n); 
      return; 
     } 

     if(first == 0 && next == 1) { 
      System.out.println("1"); 
      calculateFib(1, 0, counter, n); 
      return; 
     } 

     if(first == 1 && next == 0) { 
      System.out.println("1"); 
      calculateFib(1, 1, counter, n); 
      return; 
     } 

     long result = first + next; 
     if(result > 1) { 
      System.out.println(result); 
       calculateFib(next, result, counter, n); 
     } 
    } 

    public RecursiveFibonacci() { 
     calculateFib(0, 0, 0, 9999999); 
    } 

    public static void main(String[] args) { 
     new RecursiveFibonacci(); 
    } 

} 
+4

在[codereview](http://codereview.stackexchange.com/)可能應該詢問這個問題 – Pshemo 2013-02-12 01:12:40

+2

您關心的程序是否有特定方面?或者你只是想讓別人看看它?如果是後者,最好在codereview.stackexchange.com上發佈 – 2013-02-12 01:12:52

+0

只是不使用遞歸 - 它是一種計算斐波那契數的可怕方法,因爲您必須多次重複計算值(而不是記憶部分解決方案)。在這裏看到圖像:http://en.algoritmy.net/article/45658/Fibonacci-series,它可能幫助你更好地掌握遞歸斐波那契的問題。 – malejpavouk 2013-02-15 10:26:34

回答

1

斐波那契序列只取決於前兩個值,您的基本案例是F(0) = 1F(1) = 1,以及一般F(n) = F(n - 1) + F(n - 2)。你所需要做的就是記住這些。遞歸是解決斐波納契數字的一種不好的方法,因爲數值越高,你不必要地做出的呼叫就越多。你很快就會用完堆棧空間。

0

一個問題是,calculateFib()不返回任何計算結果。它只打印結果。因此,更改代碼以便返回結果。

一旦工作,請嘗試非遞歸變體,這在實踐中更適合。

1

我覺得遞歸斐波那契數具有非常高的計算複雜度也可能爲O(n!),而迭代就是O(n)的:)

1

計算第i個斐波那契的最好方法是而不是遞歸。您可以使用這些公式:

enter image description here

enter image description here

enter image description here

Phi是黃金比例。然而,斐波那契數字的問題與使用方法無關,但與數字的位數無關。他們將很難寫入大量。