因此,我使用循环和递归技术导出了斐波那契级数的代码。但是,我如何才能在不使用循环和递归技术的情况下编写相同的代码呢?
这是使用循环:
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();这是使用递归:
function fib(n) 
{
   return n < 2 ? n : fib(n - 1) + fib(n - 2);
}如何在不使用循环和递归的情况下获得相同的输出?我想尝试一下,因为它减少了迭代次数。
提前谢谢。
发布于 2019-01-23 12:38:51
您可以直接使用Binet的Fibonacci数公式。
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));
}
发布于 2019-01-23 13:16:43
虽然记忆法是斐波那契(参考文献: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[]的索引。
发布于 2019-01-23 15:02:44
实际上,我只是想出了一个没有循环和递归的解决方案。
function fib() {
    let t1=0,t2=1;
    return () =>  {
        const next=t1+t2;
        t1=t2;
        t2=next;
        return t1;
     }
    }
   let run=fib();我认为这个解决方案更好,并且减少了递归。
https://stackoverflow.com/questions/54320031
复制相似问题