2011-02-07 106 views
2

我要用Javascript編寫一些代碼。這裏是我們要做的:使用閉包的Javascript斐波那契

「使用閉包實現一個javascript斐波那契數字。具體來說,編寫一個函數來存儲兩個連續的斐波那契數字,最初爲0和1。該函數還定義並返回嵌套函數getNext() 。getNext()函數將兩個存儲的斐波那契數字更新爲接下來的兩個斐波那契數字並返回當前的數字。例如,在第一次調用getNext()時,返回值爲0,下一次調用時爲1,然後再次爲1 ,然後2等「。

我有點理解這一點,但不是真的。有人可能會幫助澄清?謝謝!

+5

我重新開始了作業,因爲這就是我聽起來的樣子。你有什麼嘗試?你能寫一個返回函數的函數嗎?你可以讓該函數返回一個存儲在閉包中的值嗎?如果你有這麼多,你如何更新你的價值? – btilly 2011-02-07 20:49:59

+1

似乎對我來說很合理。 CS 101還是201? - 注意問題中的提示:「寫一個函數」,「存儲兩個...數字」,「定義並返回一個**嵌套**函數」... – 2011-02-07 20:50:45

回答

8

閉包背後的基本思想是,由於閉包程序通過值綁定所有本地數據,因此可以使用它們初始化並修改僅在生成函數的「實例」本地的變量。

由於這看起來像家庭作業,我將使用閉包回答一個不同的問題:使用閉包獲取完美的正方形(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 

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

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/

我這樣做了描述爲回答這個問題 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.

3

我只是想後一點點的最新答案 - 斐波那契封閉是使用現代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()); 
}