function fib(n) {
const result = [0, 1];
for (var i = 2; i <= n; i++) {
const a = (i - 1);
const b = (i - 2);
result.push(a + b);
}
return result[n];
}
console.log(fib(8));
上面代码的输出是13
。我不明白for循环部分。在第一次迭代i = 2
,但在第二次迭代i = 3
所以a = 2
和b = 1
和第三次迭代i = 4
所以a = 3
,b = 2
,等等...如果它正在进行最后的序列将是:[0, 1, 1, 3, 5, 7, 9, 11]
,这是不正确的。正确的序列将是[0, 1, 1, 2, 3, 5, 8, 13]
您没有使用已在数组中的前两个数字来>生成要插入到数组中的新fibonacci数。
https://www.mathsisfun.com/numbers/fibonacci-sequence.html
在这里,我使用了result[i-2]
和result[i-1]
的总和来生成新的斐波纳契数并将其推入数组中。
另外要生成n
项数,你需要条件为i < n
而不是i <= n
。
function fib(n) {
const result = [0, 1];
for (var i = 2; i < n; i++) {
result.push(result[i-2] + result[i-1]);
}
return result; // or result[n-1] if you want to get the nth term
}
console.log(fib(8));
如果你想获得第n个学期,请返回result[n-1]
。
我对Fibonacci系列的解决方案:
const fibonacci = n =>
[...Array(n)].reduce(
(acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i),
[]
)
此功能不正确。只需在函数返回之前添加console.log
调用即可检查:
function fib(n) {
const result = [0, 1];
for (var i = 2; i <= n; i++) {
const a = (i - 1);
const b = (i - 2);
result.push(a + b);
}
console.log(result);
return result[n];
}
console.log(fib(7));
如您所见,序列是错误的(对于n = 7
),返回值也是如此。
可能的变化如下:
function fib(n) {
const result = [0, 1];
for (var i = 2; i <= n; i++) {
const a = result[i - 1];
const b = result[i - 2];
result.push(a + b);
}
console.log(result);
return result[n];
}
console.log(fib(8));
这是“经典”的斐波纳契数;如果你真的想使用0
的第一个数字,而不是1
,那么你应该return result[n-1]
,因为数组索引从零开始。
您可以采取的斐波那契序列的一种方法是递归:
var fibonacci = {
getSequenceNumber: function(n) {
//base case to end recursive calls
if (n === 0 || n === 1) {
return this.cache[n];
}
//if we already have it in the cache, use it
if (this.cache[n]) {
return this.cache[n];
}
//calculate and store in the cache for future use
else {
//since the function calls itself it's called 'recursive'
this.cache[n] = this.getSequenceNumber(n - 2) + this.getSequenceNumber(n - 1);
}
return this.cache[n];
},
cache: {
0: 0,
1: 1
}
}
//find the 7th number in the fibbonacci function
console.log(fibonacci.getSequenceNumber(7));
//see all the values we cached (preventing extra work)
console.log(fibonacci.cache);
//if you want to output the entire sequence as an array:
console.log(Object.values(fibonacci.cache));
上面的代码也是dynamic programming方法的一个例子。你可以看到我在第一次用cache
方法计算时将每个结果存储在getSequenceNumber
对象中。这样,第二次要求getSequenceNumber
找到给定的输入,它不需要做任何实际的工作 - 只需从cache
获取值并返回它!这是一种可应用于此类函数的优化技术,您可能需要多次查找特定输入的值。
你做错了是添加迭代器索引(i),而你需要做的是在该索引的result
中添加元素。
function fib(n) {
const result = [0, 1];
for (let i = 2; i <= n; i++) {
const a = result[(i - 1)];
const b = result[(i - 2)];
result.push(a + b);
}
console.log("Result Array: " + result);
return result[n];
}
console.log("Fibonacci Series element at 8: " + fib(8));
逻辑有两个问题:
a
和b
目前指的是i - 1
和i - 2
。相反,他们应该参考result
数组的元素,即result[i - 1]
和result[i - 2]
。result[7]
。所以返回的值应该是result[n - 1]
而不是result[n]
。function fib(n) {
const result = [0, 1];
for (var i = 2; i < n; i++) {
const a = result[i - 1];
const b = result[i - 2];
result.push(a + b);
}
console.log(result);
return result[n - 1];
}
console.log(fib(8));
Fibonacci系列的简单解决方案:
function fib(n){
var arr = [];
for(var i = 0; i <n; i++ ){
if(i == 0 || i == 1){
arr.push(i);
} else {
var a = arr[i - 1];
var b = arr[i - 2];
arr.push(a + b);
}
}
return arr
}
console.log(fib(8))
这肯定是那种“清除鸡肉的方式不止一种”的情况之一,下面这个JavaScript方法对我有用。
function fibCalc(n) {
var myArr = [];
for (var i = 0; i < n; i++) {
if(i < 2) {
myArr.push(i);
} else {
myArr.push(myArr[i-2] + myArr[i-1]);
}
}
return myArr;
}
fibCalc(8);
如上所述,这会产生[0,1,1,2,3,5,8,13]它允许我有一系列基于n的fib数。
const fib = n => {
const array = Array(n);
for (i = 0; i < array.length; i++) {
if (i > 1) {
array[i] = array[i - 1] + array[i - 2];
} else {
array[i] = 1;
}
}
return array;
}
console.log(fib(5))