簡體   English   中英

使用閉包的 Javascript Fibonacci

[英]Javascript Fibonacci using Closures

我將使用 Javascript 編寫一些代碼。 這是我們要做的:

“使用閉包實現一個 javascript Fibonacci 數。具體來說,編寫一個函數來存儲兩個連續的 Fibonacci 數,最初是 0 和 1。該函數還定義並返回一個嵌套函數 getNext()。getNext() 函數更新兩個存儲的 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

希望這有助於解釋一下? 如果沒有,請發表評論。 :-)

我只是想發布一些最新的答案 - 使用現代 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());
}
    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 等等(斐波那契數)。 不要使用任何全局變量。

fibonacci = ([f0, f1] = [0, 1]) => () => ([f0, f1] = [f1, f0 + f1])[0];

我只是想提供一個使用現代 JavaScript 編寫的最新答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM