给出前两个整数的Fibonacci序列的第n个元素

时间:2018-04-30 19:14:34

标签: javascript

我正在做一些练习,而且我遇到了一个问题,即我无法绕过头脑。

给出Fibonacci序列的前两个整数。然后,您将找到序列的第n个元素。

例如,给定序列2,4,输出4th元素。答案是10,因为:

2,4,6,10

我如何在JavaScript中编程此解决方案(有和没有递归)?

2 个答案:

答案 0 :(得分:1)

没有递归:

function Fibonacci(first, second, n){
      let iter = 3; //set it to 3 since you are passing the first and second

      //Use while loop instead of recursive calls to Fibonacci
      while(iter < n){
           let temp = first;
           first = second;
           second = temp + first;
           iter++;
      }

      //If n is one, return first
      if(n == 1)
         return first;

      //Display last item in sequence
      console.log(second);

       //Or return it
      return second;
}

使用递归:

 function Fibonacci(first, second, n){
      //If n - 2 (passing first 2 in sequence) is greater than or equal to 0, do operations and recall Fibonacci
      if((n - 2) > 0){
          let temp = first;
          first = second;
          second = temp + first;
          n--;
          return Fibonacci(first, second, n);
      }

      //If n is one, return first
      if(n == 1)
         return first;

      //Display last item in sequence
      console.log(second);

      //Or return it
      return second;
}

答案 1 :(得分:1)

您可以使用a closed formula执行此操作,然后您不需要递归或循环。当n很大时,这将减少很少的操作:

function nthFib( u0, u1, n ) {
    const sqrt5 = 5**.5;
    const golden = (1 + sqrt5)/2;
    const a = (u1 - u0*(1 - golden))/sqrt5;
    const b = (u0*golden - u1)/sqrt5;
    return Math.round(a*golden**--n + b*(1 - golden)**n);
}

console.log( nthFib( 2, 4, 1 ) );
console.log( nthFib( 2, 4, 2 ) );
console.log( nthFib( 2, 4, 3 ) );
console.log( nthFib( 2, 4, 4 ) );
console.log( nthFib( 2, 4, 5 ) );
console.log( nthFib( 1, 7, 8 ) );

公式的结果应该是精确的,但由于浮点运算需要Math.round以确保始终得到整数。

既然你要求看一个带递归的解决方案,这里有一个:

function nthFib( u0, u1, n ) {
    return n > 1 ? nthFib( u1, u0 + u1, n - 1 ) : u0;
}

console.log( nthFib( 2, 4, 1 ) );
console.log( nthFib( 2, 4, 2 ) );
console.log( nthFib( 2, 4, 3 ) );
console.log( nthFib( 2, 4, 4 ) );
console.log( nthFib( 2, 4, 5 ) );
console.log( nthFib( 1, 7, 8 ) );

最后,这是一个使用循环的解决方案:

function nthFib( u0, u1, n ) {
    for ( let i = 2; i <= n; i++ )
        [ u0, u1 ] = [ u1, u0 + u1 ];
    return u0;
}

console.log( nthFib( 2, 4, 1 ) );
console.log( nthFib( 2, 4, 2 ) );
console.log( nthFib( 2, 4, 3 ) );
console.log( nthFib( 2, 4, 4 ) );
console.log( nthFib( 2, 4, 5 ) );
console.log( nthFib( 1, 7, 8 ) );

注意:所有这些解决方案都基于n为正整数的前提条件。当n为非正数或不是整数时,它们可能表现出彼此不同的行为。如果您要将它们中的任何一个用于实际项目,您可能希望在它们的开头添加某种保护,如果n不是正整数则会引发错误。