2

我将使用 Javascript 编写一些代码。这是我们要做的:

“使用闭包实现 javascript 斐波那契数。具体来说,编写一个函数来存储两个连续的斐波那契数,最初为 0 和 1。该函数还定义并返回一个嵌套函数 getNext()。getNext() 函数更新两个存储的斐波那契数到接下来的两个斐波那契数并返回当前一个。例如,在第一次调用 getNext() 时,返回值为 0,在下一次调用时为 1,然后再次为 1,然后为 2,等等。

我有点明白这一点,但不是真的。有人可以帮忙澄清一下吗?谢谢!

4

4 回答 4

9

闭包背后的基本思想是,由于关闭器按值绑定所有本地数据,因此您可以使用它们来初始化然后修改仅对生成函数的“实例”本地的变量。

由于这似乎是家庭作业,我将使用闭包来回答一个不同的问题:使用闭包获得完美的正方形(1、4、9 等),一次一个。

function makeSquareIteratorFunction() {
  var squareRoot = 1;

  var getNext = function() {
    // Calculate the number you need to return
    var square = squareRoot * squareRoot;

    // Apply side effects. In this case just incrementing the counter, but with
    // Fibonacci you will need to be a little more creative :-)
    // You might also prefer to do this first. Depends on your approach.
    squareRoot = squareRoot + 1;

    // Return the value
    return square;
  };

  // Return the function object, which can then be called later
  return getNext;
}

// Usage
var getNextSquare = makeSquareIteratorFunction();
alert(getNextSquare()); // 1
alert(getNextSquare()); // 4
alert(getNextSquare()); // 9

现在,值得指出的是,在外部函数 ( makeSquareIteratorFunction) 中定义的局部变量是本地化的并绑定到闭包。所以如果你makeSquareIteratorFunction()多次调用,后面的将独立于第一个:

var getNextSquare1 = makeSquareIteratorFunction();
alert(getNextSquare1()); // 1
alert(getNextSquare1()); // 4
var getNextSquare2 = makeSquareIteratorFunction();
alert(getNextSquare2()); // 1 (!) because it's a new closure, initialized the same way
alert(getNextSquare1()); // 9 (!) because it was "on" 4 last time

希望这有助于解释一下?如果没有,请发表评论。:-)

于 2011-02-07T20:56:15.523 回答
5

我只是想发布更多最新的答案-使用现代 JavaScript 编写的斐波那契闭包更具可读性

function fibonacci() {
    let x = 0;
    let y = 1;
    let z = 0;
    return function getNext() {
        [z, x, y] = [x, y, x + y];
        return z;
    };
}

let fun = fibonacci();

for (let i = 0; i < 10; i++) {
    console.log(fun());
}
于 2017-04-20T18:41:49.823 回答
1
    var fibonacci = (function () {
        var arr = [0, 1];
        return function () {
            var num = arr[arr.length - 1],
                len = arr.length;
            arr.push(arr[len - 1] + arr[len - 2]);
            return num;
        };
    }());

    //test
    var i;
    for (i = 0; i < 10; i++) {
        console.log(fibonacci());
    }
   //1,1,2,3,5,8,13,21,34,55

请参阅http://sarathsaleem.github.com/JavaScriptTasks/中的描述

我这样做是为了回答这个问题 写一个函数,它将首先返回两次 1,然后是 2,然后是 3,然后是 5,依此类推(斐波那契数)。不要使用任何全局变量。

于 2013-03-11T19:21:10.970 回答
0
fibonacci = ([f0, f1] = [0, 1]) => () => ([f0, f1] = [f1, f0 + f1])[0];

我只是想给出一个使用现代 JavaScript 编写的更新的答案。

于 2020-08-29T20:20:20.300 回答