使用闭包的Javascript Fibonacci

使用闭包的Javascript Fibonacci,javascript,closures,fibonacci,Javascript,Closures,Fibonacci,我将使用Javascript编写一些代码。以下是我们要做的: 使用闭包实现javascript Fibonacci数。具体来说,编写一个函数来存储两个连续的Fibonacci数,最初为0和1。该函数还定义并返回一个嵌套函数getNext()。getNext()函数函数将存储的两个Fibonacci数更新为下两个Fibonacci数并返回当前的Fibonacci数。例如,第一次调用getNext()时返回值为0,下一次调用时返回值为1,然后再次返回1,然后返回2,以此类推。” 我有点理解这一点,但

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

使用闭包实现javascript Fibonacci数。具体来说,编写一个函数来存储两个连续的Fibonacci数,最初为0和1。该函数还定义并返回一个嵌套函数getNext()。getNext()函数函数将存储的两个Fibonacci数更新为下两个Fibonacci数并返回当前的Fibonacci数。例如,第一次调用getNext()时返回值为0,下一次调用时返回值为1,然后再次返回1,然后返回2,以此类推。”


我有点理解这一点,但不是真的。有人能帮忙澄清一下吗?谢谢

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

因为这看起来像是家庭作业,所以我将使用闭包来回答一个不同的问题:使用闭包来获得完美的正方形(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
希望这有助于解释这一点?如果没有,请留下评论。:-)

var fibonacci=(函数(){
var-arr=[0,1];
返回函数(){
var num=arr[arr.length-1],
len=arr.长度;
arr.push(arr[len-1]+arr[len-2]);
返回num;
};
}());
//试验
var i;
对于(i=0;i<10;i++){
log(fibonacci());
}
//1,1,2,3,5,8,13,21,34,55
请参见中的描述

我这样做是为了回答这个问题

我只是想发布一个更新一点的答案-斐波那契闭包更易于阅读,使用现代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());
}
函数fibonacci(){ 设x=0; 设y=1; 设z=0; 返回函数getNext(){ [z,x,y]=[x,y,x+y]; 返回z; }; } 让乐趣=斐波那契(); for(设i=0;i<10;i++){ log(fun()); }
我只是想给出一个使用现代JavaScript编写的更为最新的答案。

我重新给它加上了家庭作业的标签,因为我觉得这就是它听起来的样子。你试过什么?你能写一个返回函数的函数吗?可以让该函数返回存储在闭包中的值吗?如果你做到了这一点,你如何更新你的价值观?我似乎相当清楚。CS 101或201?——请注意问题中的提示:“编写一个函数”、“存储两个……数字”、“定义并返回一个嵌套函数”……如果这让您感到困惑的话,我在这里解释了闭包是如何工作的:fibonacci=([f0,f1]=[0,1])=>([f0,f1]=[f1,f0+f1])[0];这够现代吗D
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());
}
fibonacci = ([f0, f1] = [0, 1]) => () => ([f0, f1] = [f1, f0 + f1])[0];