2011-02-07 1 views
2

私はJavascriptを使用していくつかのコードを書くことです。Javascriptを使用してフィボナッチクロージャは

"最初に0と1の2つの連続したフィボナッチ数を格納する関数を記述します。この関数は、ネストされた関数getNext()も定義して返します。 。getNextを()関数は、次の二つのフィボナッチ数への2つの保存されたフィボナッチ数を更新し、現在のいずれかを返す。例:getNextを(の最初の呼び出し時に)戻り値は、それが次いで1再度、1次コールで、0であります、次に2など "

私は一種のではなく、本当にこれを理解しています。誰かが明らかにするのを助けるかもしれない?ありがとう!

+5

私はそれが私のように聞こえるので、宿題を付け直しました。何を試しましたか?あなたは関数を返す関数を書くことができますか?その関数がクロージャーに格納されている値を返すことはできますか?あなたがそれを得るなら、あなたはどのようにあなたの価値を更新しますか? – btilly

+1

合理的に私には明らかです。 CS 101または201?私はそれが何だあれば、クロージャが、ここではどのように動作するかを説明 –

+1

...「関数を書く」、「店舗2つの...番号」、「定義し、ネストされた** **関数を返す」: - 問題のヒントに注意してください。あなたを混乱させる:http://sleeplessgeek.blogspot.com/2009/12/so-what-are-these-closure-thingys.html –

答えて

8

閉鎖の背後にある基本的な考え方は、クローザーが値によって、すべてのローカルデータをバインドするので、あなたは初期化して生成された関数の「インスタンス」にのみローカルな変数を変更するためにそれらを使用することができ、ということです。

これは宿題のように思えるので、私は、クロージャを使用して別の質問に答えるつもりです:完璧な正方形(1、4、9、など)を1つずつ取得するためにクロージャを使用してください。

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 

うまくいけば、それを少し説明役立つこと?そうでない場合は、コメントを残してください。 :-)

+0

はい、それは素晴らしいです!私は今理解しています:) – user487743

+0

すばらしい例。ありがとう – Ryan

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 

は、私はちょうど日付の解答までより少しを投稿したかった 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

この質問への答えとしてhttp://sarathsaleem.github.com/JavaScriptTasks/

私はこれをしなかったの説明を参照してください - フィボナッチ閉鎖は現代の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()); 
} 
関連する問題