Recursion 求斐波那契数的最佳方法

Recursion 求斐波那契数的最佳方法,recursion,Recursion,斐波那契级数是0 1 2 3 5 8。。。等等可以使用交换元素并显示它们来获得它,而我们可以使用数组来获得它。我被要求在访谈中使用递归和主要逻辑来找到它 int fib(int n){ if(n<1) return 1; else return fib(n-1)+fib(n-2);} intfib(intn){ 如果(nmemonization.创建只计算一次fib numb的逻辑 static BigInteger[] fibNumbs = new BigInteger

斐波那契级数是0 1 2 3 5 8。。。等等可以使用交换元素并显示它们来获得它,而我们可以使用数组来获得它。我被要求在访谈中使用递归和主要逻辑来找到它

int fib(int n){
if(n<1)
    return 1;
else
    return fib(n-1)+fib(n-2);}
intfib(intn){

如果(nmemonization.创建只计算一次fib numb的逻辑

static BigInteger[] fibNumbs = new BigInteger[10000];


public static void main(String[] args) {
        fibNumbs[1] = BigInteger.ONE;
        fibNumbs[2] = BigInteger.ONE;
        System.out.println(fibOf(10000));
    }

public static BigInteger fibOf(int n) {
        if (n <= 1) {
            return BigInteger.ONE;
        }

        if (fibNumbs[n - 1]==null) {
            fibNumbs[n - 1] = fibOf(n - 1);
        }

        if (fibNumbs[n - 2]==null) {
            fibNumbs[n - 2] = fibOf(n - 2);
        }

        return fibNumbs[n - 1].add(fibNumbs[n - 2]);
    }
static biginger[]fibNumbs=new biginger[10000];
公共静态void main(字符串[]args){
fibNumbs[1]=BigInteger.1;
fibNumbs[2]=BigInteger.1;
系统输出打印LN(fibOf(10000));
}
公共静态大整数fibOf(int n){

如果(nmemonization.创建只计算一次fib numb的逻辑

static BigInteger[] fibNumbs = new BigInteger[10000];


public static void main(String[] args) {
        fibNumbs[1] = BigInteger.ONE;
        fibNumbs[2] = BigInteger.ONE;
        System.out.println(fibOf(10000));
    }

public static BigInteger fibOf(int n) {
        if (n <= 1) {
            return BigInteger.ONE;
        }

        if (fibNumbs[n - 1]==null) {
            fibNumbs[n - 1] = fibOf(n - 1);
        }

        if (fibNumbs[n - 2]==null) {
            fibNumbs[n - 2] = fibOf(n - 2);
        }

        return fibNumbs[n - 1].add(fibNumbs[n - 2]);
    }
static biginger[]fibNumbs=new biginger[10000];
公共静态void main(字符串[]args){
fibNumbs[1]=BigInteger.1;
fibNumbs[2]=BigInteger.1;
系统输出打印LN(fibOf(10000));
}
公共静态大整数fibOf(int n){

如果(n如果我告诉你两个连续的斐波那契数,例如,
a=3
b=5
,你能猜到下一个吗?这两个数相加,所以它的
8
。现在用
a=5
和新计算的数
b=8
你可以计算下一个数了吗?你开始迭代时先用两个
0
1
和每次倒计时时,你想要的数字的索引,当你达到零时,
a
是你的答案。这是一个O(n)算法。

如果我告诉你两个连续的斐波那契数,例如
a=3
b=5
,你能猜到下一个吗?这是两个数的总和,所以它的
8
。现在用
a=5
和新计算的数
b=8
你可以计算下一个数了吗?你可以用前两个
0
1开始迭代
和您希望在每次迭代中倒数的数字的索引,当您达到零时,a
是您的答案。这是一个O(n)算法。

讽刺的是,上面使用的方法,即二进制递归通过在每个非基情况下进行两次递归调用来计算斐波那契数。不幸的是,以这种方式直接实现斐波那契公式数需要对该方法进行指数级调用

我们试图使用糟糕的递归公式,因为第n个斐波那契数F(n)依赖于前面的两个值F(n-2)和F(n-1)。但是请注意,在计算F(n-2)之后,调用计算F(n-1)需要自己的递归调用来计算F(n-2),因为它不知道F(n-2)的值这是在早期的递归级别上计算的。这是重复的工作。更糟糕的是,这两个调用都需要(重新)计算F(n-3)的值,计算F(n-1)的值也是如此。这种滚雪球效应导致了
fib()
的指数级运行时间

我们可以计算F(n)使用线性递归效率更高,其中每个调用只进行一次递归调用。为此,我们需要重新定义该方法的期望值。与使用返回单个值(即第n个斐波那契数)的方法不同,我们定义了一个递归方法,该方法返回具有两个连续Fi的数组使用约定F(-1)=0的bonacci数{F(n),F(n-1)}。虽然报告两个连续的Fibonacci数而不是一个数似乎是一个更大的负担,但将这些额外的信息从递归的一个级别传递到下一个级别会使继续该过程更容易。(它允许我们避免重新计算递归中已知的第二个值。)
基于此策略的实现是

具有讽刺意味的是,上面使用的方法,即二进制递归通过在每个非基情况下进行两次递归调用来计算斐波那契数。不幸的是,以这种方式直接实现斐波那契公式数需要对该方法进行指数级调用。

我们试图使用糟糕的递归公式,因为第n个斐波那契数F(n)依赖于前面的两个值F(n-2)和F(n-1)。但是请注意,在计算F(n-2)之后,调用计算F(n-1)需要自己的递归调用来计算F(n-2),因为它不知道F(n-2)的值这是在早期的递归级别上计算的。这是重复的工作。更糟糕的是,这两个调用都需要(重新)计算F(n-3)的值,计算F(n-1)的值也是如此。这种滚雪球效应导致了
fib()
的指数级运行时间

我们可以计算F(n)使用线性递归效率更高,其中每个调用只进行一次递归调用。为此,我们需要重新定义该方法的期望值。与使用返回单个值(即第n个斐波那契数)的方法不同,我们定义了一个递归方法,该方法返回具有两个连续Fi的数组使用约定F(-1)=0的bonacci数{F(n),F(n-1)}。虽然报告两个连续的Fibonacci数而不是一个数似乎是一个更大的负担,但将这些额外的信息从递归的一个级别传递到下一个级别会使继续该过程更容易。(它允许我们避免重新计算递归中已知的第二个值。)
基于此策略的实现是

请发布有效的Java代码或更改tag@LuisMuñoz这段代码是我的java程序中的一个方法。这个方法对java来说有什么是无效的?使代码能够运行更大数量的标准方法是使用memonization()这在Java中很容易实现。但是——斐波那契数增长非常快,因此您将很快遇到
int
所能容纳的问题,因此您可能应该切换到大整数。另一个想法是,让递归辅助函数返回两个连续的对