JavaScript中的斐波那契数列

时间:2018-06-30 04:59:56

标签: javascript fibonacci

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 = 2b = 1以及第三次迭代i = 4这样,a = 3,{{1} },依此类推...如果继续进行,则最后一个序列将是: b = 2,这是不正确的。正确的顺序为[0, 1, 1, 3, 5, 7, 9, 11]

13 个答案:

答案 0 :(得分:4)

  

您没有使用数组中已有的前两个数字>生成要插入到数组中的新斐波那契数。

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]

答案 1 :(得分:1)

此功能不正确。只需在函数返回之前添加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],因为数组索引从零开始。

答案 2 :(得分: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中获取值并返回它即可!这是一种优化技术,可以应用于类似这样的函数,在这些函数中,您可能不得不多次查找特定输入的值。

答案 3 :(得分:1)

我的斐波那契数列解决方案:

 const fibonacci = n =>
      [...Array(n)].reduce(
        (acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i),
        []
      )

答案 4 :(得分:0)

您做错了的是添加迭代器索引(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));

答案 5 :(得分:0)

逻辑有两个问题:

  1. 变量ab当前是指i - 1i - 2。相反,它们应该引用result数组的元素,即result[i - 1]result[i - 2]

  2. 如果需要数组的第8个元素,则需要调用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));

答案 6 :(得分:0)

斐波那契数列的简单解决方案:

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))

答案 7 :(得分:0)

这肯定是“一种以上的清洁鸡的方式”类型的情况之一,下面的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编号。

答案 8 :(得分:0)

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))

答案 9 :(得分:0)

function fib(n) {
    const result = [0];

    if (n > 1) {
        result.push(1);

        for (var i = 2; i < n; i++) {
            const a = result[result.length - 1]
            const b = result[result.length - 2];
            result.push(a + b);
        }

    }
    console.log(result);
}

答案 10 :(得分:0)

我想出了这个解决方案来获得n指数斐波那契值。

function findFac(n){
if (n===1) 
  {
   return [0, 1];
  } 
  else 
  {
    var s = findFac(n - 1);
    s.push(s[s.length - 1] + s[s.length - 2]);
    return s;
  }
}

function findFac0(n){
var vv1 = findFac(n);
return vv1[n-1];
}


console.log(findFac0(10));

答案 11 :(得分:0)

在这里,您只需进行很少的参数检查,而无需使用异常处理

function fibonacci(limit){
    if(typeof limit != "number"){return "Please enter a natural number";}

    if(limit <=0){
        return "limit should be at least 1";
    }
    else if(limit == 1){
        return [0];
    }
    else{
        var series = [0, 1];
        for(var num=1; num<=limit-2; num++){
            series.push(series[series.length-1]+series[series.length-2]);
        }
        return series;
    }
}

答案 12 :(得分:0)

我想出了这个解决方案。

function fibonacci(n) {
    if (n == 0) {
        return [0];
    }
    if ( n == 1) {
        return [0, 1];
    } else {
        let fibo = fibonacci(n-1);
        let nextElement = fibo [n-1] + fibo [n-2];
        fibo.push(nextElement);
        return fibo;
    }
}
console.log(fibonacci(10));