使用循环和递归的斐波那契数列

时间:2019-01-23 04:27:53

标签: javascript

因此,我使用循环和递归技术派生了斐波那契数列的代码。但是,如何在不使用循环和递归技术的情况下为同一代码编写代码?

这是使用循环:

fftw

这是使用递归:

function fibouter()
 {
    let n=1;
     function fib()
    {
      let t1=0,t2=1,next,i;
       for(i=1;i<=n;++i)
       {
            next=t1+t2;
             t1=t2;
             t2=next;
        }
        n++;
       return t2;

     }
     return fib;
 }
   const run=fibouter();

如何在不使用循环和递归的情况下获得相同的输出? 我想尝试一下,因为它减少了迭代次数。

谢谢。

3 个答案:

答案 0 :(得分:2)

您可以直接使用Binet的斐波那契数公式。

function fib(n){return Math.round((Math.pow((1+Math.sqrt(5))/2,n)-Math.pow((1-Math.sqrt(5))/2,n))/Math.sqrt(5))}

for(let i = 0 ; i < 15; i++)
{
    console.log(fib(i));
}

答案 1 :(得分:0)

尽管记忆是斐波那契的最佳方法(Ref:Fibonacci memoization algorithm in C++),但是当您要求一种无需递归和循环的计算方法时,这是最基本的方法。尽管您仍然需要一个循环,但是您可以做的是将预先计算的斐波那契数列存储在数组中,并根据需要进行打印。示例:

int fib[100000];
fib[0] = 1;
fib[1] = 2;
for (int i=3; i<100000; ++i) {
    fib[i]=fib[i-1]+fib[i-2];
}

然后,您可以要求打印斐波那契的哪个位置,只需打印数组fib []的索引即可。

答案 2 :(得分:0)

实际上,我只是想出了一种无需使用循环和递归的解决方案。

/bin/sh

我认为这种解决方案更好,可以减少递归。