var x = 0;
var y = 1;
var z;
fib[0] = 0;
fib[1] = 1;
for (i = 2; i <= 10; i++) {
alert(x + y);
fib[i] = x + y;
x = y;
z = y;
}
我试图生成一个简单的斐波那契数列,但没有输出。
任何人都可以让我知道出了什么问题吗?
var x = 0;
var y = 1;
var z;
fib[0] = 0;
fib[1] = 1;
for (i = 2; i <= 10; i++) {
alert(x + y);
fib[i] = x + y;
x = y;
z = y;
}
我试图生成一个简单的斐波那契数列,但没有输出。
任何人都可以让我知道出了什么问题吗?
您从未声明fib
为数组。使用var fib = [];
来解决这个问题。
此外,您永远不会修改y
变量,也不会使用它。
下面的代码更有意义,此外,它不会创建未使用的变量:
var i;
var fib = []; // Initialize array!
fib[0] = 0;
fib[1] = 1;
for (i = 2; i <= 10; i++) {
// Next fibonacci number = previous + one before previous
// Translated to JavaScript:
fib[i] = fib[i - 2] + fib[i - 1];
console.log(fib[i]);
}
根据面试蛋糕问题,序列为0,1,1,2,3,5,8,13,21。如果是这种情况,则此解决方案有效并且在不使用数组的情况下递归。
function fibonacci(n) {
return n < 1 ? 0
: n <= 2 ? 1
: fibonacci(n - 1) + fibonacci(n - 2)
}
console.log(fibonacci(4))
像这样想。
fibonacci(4) .--------> 2 + 1 = 3
| / |
'--> fibonacci(3) + fibonacci(2)
| ^
| '----------- 2 = 1 + 1 <----------.
1st step -> | ^ |
| | |
'----> fibonacci(2) -' + fibonacci(1)-'
请注意,尽管此解决方案效率不高。
这是一个简单的函数,它使用函数中的参数而for
不是循环体将斐波那契数列迭代到数组中:
fib = function(numMax){
for(var fibArray = [0,1], i=0,j=1,k=0; k<numMax;i=j,j=x,k++ ){
x=i+j;
fibArray.push(x);
}
console.log(fibArray);
}
fib(10)
[ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 ]
另一个答案是使用 es6生成器函数。
function* fib() {
var current = a = b = 1;
yield 1;
while (true) {
current = b;
yield current;
b = a + b;
a = current;
}
}
sequence = fib();
sequence.next(); // 1
sequence.next(); // 1
sequence.next(); // 2
// ...
您应该首先将fib
变量声明为数组(例如var fib = []
or var fib = new Array()
),我认为您对算法有点困惑。
如果使用数组存储斐波那契数列,则不需要其他辅助变量 ( x,y,z
) :
var fib = [0, 1];
for(var i=fib.length; i<10; i++) {
fib[i] = fib[i-2] + fib[i-1];
}
console.log(fib);
您也应该考虑递归方法(请注意,这是一个优化版本):
function fib(n, undefined){
if(fib.cache[n] === undefined){
fib.cache[n] = fib(n-1) + fib(n-2);
}
return fib.cache[n];
}
fib.cache = [0, 1, 1];
然后,在调用 fibonacci 函数后,您就拥有了fib.cache
字段中的所有序列:
fib(1000);
console.log(fib.cache);