首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用闭包的Javascript Fibonacci

使用闭包的Javascript Fibonacci
EN

Stack Overflow用户
提问于 2011-02-08 04:45:44
回答 4查看 4.6K关注 0票数 2

我要写一些代码使用Javascript。下面是我们要做的事情:

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

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

EN

回答 4

Stack Overflow用户

发布于 2011-02-08 04:56:16

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

因为这看起来像是家庭作业,所以我将使用闭包回答一个不同的问题:使用闭包来获得完美的正方形(1,4,9等),一次一个。

代码语言:javascript
复制
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(),则后面的调用将独立于第一个调用:

代码语言:javascript
复制
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

希望这能帮你解释一下?如果没有,请留言。:-)

票数 9
EN

Stack Overflow用户

发布于 2017-04-21 02:41:50

我只是想多贴一点最新的答案--斐波那契闭包是用现代的JavaScript编写的,可读性更强。

代码语言: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());
}
票数 5
EN

Stack Overflow用户

发布于 2013-03-12 03:21:11

代码语言:javascript
复制
    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/中的描述

我这样做是为了回答这个问题Write a function which will return you first two times 1, then 2, then 3, then 5 and so on (Fibonacci numbers). Don’t use any global variables.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4926359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档