生成斐波那契数列

48
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;
}

我尝试生成一个简单的斐波那契数列,但没有输出。

请问有人能告诉我出了什么问题吗?

52个回答

2

sparkida,发现你的方法有一个问题。如果你检查第10个位置,它会返回54并导致所有后续值不正确。你可以在这里看到它的表现:http://jsfiddle.net/createanaccount/cdrgyzdz/5/

(function() {
  
function fib(n) {
    var root5 = Math.sqrt(5);
    var val1 = (1 + root5) / 2;
    var val2 = 1 - val1;
    var value = (Math.pow(val1, n) - Math.pow(val2, n)) / root5;

    return Math.floor(value + 0.5);
}
    for (var i = 0; i < 100; i++) {
        document.getElementById("sequence").innerHTML += (0 < i ? ", " : "") + fib(i);
    }

}());
<div id="sequence">
    
</div>


@sparkida - 更仔细地看了一下,这个方法在第76次迭代后就完全失控了。它给出了一个值为3416454622906706的结果,但应该是3416454622906707。然后在之后的几次迭代中(第81或82次),所有的值都能被100、1000等整除。 - geeves

2

我只想用ES6编写一个尾调用优化版本来做出贡献。这很简单;

var fibonacci = (n, f = 0, s = 1) => n === 0 ? f : fibonacci(--n, s, f + s);
console.log(fibonacci(12));


请直接参考sqram的答案。 - vsync

2
以下是使用递归、生成器和reduce编写斐波那契数列的示例。

'use strict'

//------------- using recursion ------------
function fibonacciRecursion(n) {
  return (n < 2) ? n : fibonacciRecursion(n - 2) + fibonacciRecursion(n - 1)
}

// usage
for (let i = 0; i < 10; i++) {
  console.log(fibonacciRecursion(i))
}


//-------------- using generator -----------------
function* fibonacciGenerator() {
  let a = 1,
    b = 0
  while (true) {
    yield b;
    [a, b] = [b, a + b]
  }
}

// usage
const gen = fibonacciGenerator()
for (let i = 0; i < 10; i++) {
  console.log(gen.next().value)
}

//------------- using reduce ---------------------
function fibonacciReduce(n) {
  return new Array(n).fill(0)
    .reduce((prev, curr) => ([prev[0], prev[1]] = [prev[1], prev[0] + prev[1]], prev), [0, 1])[0]
}

// usage
for (let i = 0; i < 10; i++) {
  console.log(fibonacciReduce(i))
}


1
这个脚本将以数字作为参数,用于指定你想让斐波那契数列到达的位置。
function calculateFib(num) {
    var fibArray = [];
    var counter = 0;

    if (fibArray.length == 0) {
        fibArray.push(
            counter
        );
        counter++
    };

    fibArray.push(fibArray[fibArray.length - 1] + counter);

    do {
        var lastIndex = fibArray[fibArray.length - 1];
        var snLastIndex = fibArray[fibArray.length - 2];
        if (lastIndex + snLastIndex < num) {
            fibArray.push(lastIndex + snLastIndex);
        }

    } while (lastIndex + snLastIndex < num);

    return fibArray;

};

1
这是我想出来的。
//fibonacci numbers
//0,1,1,2,3,5,8,13,21,34,55,89
//print out the first ten fibonacci numbers
'use strict';
function printFobonacciNumbers(n) {
    var firstNumber = 0,
        secondNumber = 1,        
        fibNumbers = [];
    if (n <= 0) {
        return fibNumbers;
    }
    if (n === 1) {
        return fibNumbers.push(firstNumber);
    }
    //if we are here,we should have at least two numbers in the array
    fibNumbers[0] = firstNumber;
    fibNumbers[1] = secondNumber;
    for (var i = 2; i <= n; i++) {
        fibNumbers[i] = fibNumbers[(i - 1)] + fibNumbers[(i - 2)];
    }
    return fibNumbers;
}

var result = printFobonacciNumbers(10);
if (result) {
    for (var i = 0; i < result.length; i++) {
        console.log(result[i]);
    }
}

1

初学者,不太优雅,但展示了JavaScript的基本步骤和推断。

/* Array Four Million Numbers */
var j = [];
var x = [1,2];
var even = [];
for (var i = 1;i<4000001;i++){
   j.push(i);
    }
// Array Even Million
i = 1;
while (i<4000001){
    var k = j[i] + j[i-1];
    j[i + 1]  = k;
    if (k < 4000001){
        x.push(k);
        }
    i++;
    }
var total = 0;
for (w in x){
    if (x[w] %2 === 0){
        even.push(x[w]);
        }
 }
for (num in even){
    total += even[num];
 }
console.log(x);
console.log(even);
console.log(total); 

1
斐波那契数列(一行代码实现)
function fibonacci(n) {
  return (n <= 1) ? n : fibonacci(n - 1) + fibonacci(n - 2);
}

斐波那契数列(递归)

function fibonacci(number) {
  // n <= 1
  if (number <= 0) {
    return n;
  } else {
    // f(n) = f(n-1) + f(n-2)
    return fibonacci(number - 1) + fibonacci(number - 2);
  }
};

console.log('f(14) = ' + fibonacci(14)); // 377

斐波那契数列(迭代实现)

 function fibonacci(number) {
  // n < 2
  if (number <= 0) {
    return number ;
  } else {
    var n = 2; // n = 2
    var fn_1 = 0; // f(n-2), if n=2
    var fn_2 = 1; // f(n-1), if n=2   

    // n >= 2
    while (n <= number) {
      var aa = fn_2; // f(n-1)
      var fn = fn_1 + fn_2; // f(n)

      // Preparation for next loop
      fn_1 = aa;
      fn_2 = fn;

      n++;
    }

    return fn_2;
  }
};

console.log('f(14) = ' + fibonacci(14)); // 377

斐波那契数列(带有尾调用优化

function fibonacci(number) {
  if (number <= 1) {
    return number;
  }

  function recursion(length, originalLength, previous, next) {
    if (length === originalLength)
      return previous + next;

    return recursion(length + 1, originalLength, next, previous + next);
  }

  return recursion(1, number - 1, 0, 1);
}

console.log(`f(14) = ${fibonacci(14)}`); // 377


3
递归实现斐波那契数列具有指数级别的复杂度,不应用于计算大的斐波那契数。 - yunandtidus

1
    // using recursive approach and in one line
    const fib = x => (x <= 1)? x : fib (x - 1) + fib(x -2);
    fib(15); // 610

    // display the 15 first 
    Array.from({ length: 15 }, (v, i) => fib(i)); 
    // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
    
    

    // using memoization approach
    function fibonacci(num, memo) {
      memo = memo || {};
      if (memo[num]) return memo[num];
      if (num === 0) return 0;
      if (num === 1) return 1;
      return memo[num] = fibonacci(num - 1, memo) + fibonacci(num - 2, memo);
    }
    fibonacci(15); // 610

    // display the 15 first 
    Array.from({ length: 15 }, (v, i) => fibonacci(i));
    // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

1
我的看法:

function fibonacci(num) {
  return Array.apply(null, Array(num)).reduce(function(acc, curr, idx) {
    return idx > 2 ? acc.concat(acc[idx-1] + acc[idx-2]) : acc;
  }, [0, 1, 1]);
}

console.log(fibonacci(10));


1
我尝试过这个:它可能有效:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Fibonacci</title>
    <style>
        * {
            outline: 0px;
            margin: 0px;
        }

        input[type="number"] {
            color: blue;
            border: 2px solid black;
            width: 99.58vw;
        }
    </style>
</head>

<body>
    <div id="myDiv" style="color: white;background-color: blue;">Numbers Here</div>
    <input type="number" id="input1" oninput="fibonacciProgram(this.value)" placeholder="Type Some Numbers Here">
    <script>
        function fibonacciProgram(numberCount) {
            let resultElement = document.getElementById("myDiv");
            resultElement.innerHTML = " ";
            if (isNaN(numberCount) || numberCount <= 0) {
                resultElement.innerHTML = "please enter a number";
                return;
            }
            let firstBox = 0;
            let secondBox = 1;
            let swichBox;
            let entries = [];
            entries.push(secondBox);
            while (numberCount > 1) {
                swichBox = firstBox + secondBox;
                entries.push(swichBox);
                firstBox = secondBox;
                secondBox = swichBox;
                numberCount--;
            }
            resultElement.innerHTML = entries.join(', ');
        }
    </script>
</body>

</html>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接