用于大数的Java递归斐波纳契实现

时间:2013-02-12 01:09:36

标签: java algorithm recursion fibonacci

我今晚一直在玩一些代码,我编写了一个非常简单的算法,我认为这是一个非常好的解决方案,对于斐波那契递归和大数字。我想知道你们对它的看法,如果你对它做得更好有所贡献,请与我们分享......看看下面的代码

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(); 
    }

}

5 个答案:

答案 0 :(得分:1)

Fibonacci序列仅取决于前两个值,您的基本案例为F(0) = 1F(1) = 1,一般为F(n) = F(n - 1) + F(n - 2)。您需要做的就是在计算时记住这些。递归是解决斐波纳契数的一种不好的方法,因为值越大,你不必要地做出越多的调用。你很快就会耗尽堆栈空间。

答案 1 :(得分:1)

我认为递归的斐波纳契也具有非常高的计算复杂度,可能是O(n!),而迭代只是O(n):)

答案 2 :(得分:1)

计算第i个斐波那契的最佳方法不是通过递归。您可以使用以下公式:

enter image description here

enter image description here

enter image description here

phi是黄金比例。然而,Fibonacci数的问题与使用的方法无关,而与数字的位数无关。他们将难以为大数字写作。

答案 3 :(得分:0)

一个问题是,calculateFib()不会返回任何计算结果。它只打印结果。因此,请更改代码,使其返回结果。

一旦有效,请尝试非递归变体,这在实践中更适合。

答案 4 :(得分:0)

因为F 9999999 有~2089876个数字,所以你想要使用approximation。另请考虑memoization