我正在做一些练习,而且我遇到了一个问题,即我无法绕过头脑。
给出Fibonacci序列的前两个整数。然后,您将找到序列的第n个元素。
例如,给定序列2,4
,输出4th
元素。答案是10
,因为:
2,4,6,10
我如何在JavaScript中编程此解决方案(有和没有递归)?
答案 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
不是正整数则会引发错误。