2013-02-12 84 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是黄金比例。然而,斐波那契数字的问题与使用方法无关,但与数字的位数无关。他们将很难写入大量。