2016-12-26 5 views
1

フィボナッチ数/シーケンスを計算するジェネレータをまとめました。しかし、それは私が期待するように動作していません。私はPythonからそれを "蒸散"しましたが、Pythonのように自分のロジックに合わないJavaScriptコードに何があるのか​​わかりません...誰も私にこのヒントを教えてもらえますか?私は、これは変数のスコープの問題だと思うフィボナッチシーケンスを計算するためのJavascriptジェネレータを作成するにはどうすればよいですか?

// Fibonacci generator 
 
function* fibonacci() { 
 
    var a = 0; 
 
    var b = 1; 
 
    while (true) { 
 
    yield a; 
 
    a = b; 
 
    b = a + b; 
 
    } 
 
} 
 

 
// Instantiates the fibonacci generator 
 
fib = fibonacci(); 
 

 
// gets first 10 numbers from the Fibonacci generator starting from 0 
 
for (let i = 0; i < 10; i++) { 
 
    console.log(i + ' => ' + fib.next().value); 
 
}

は、ここでは、コードです。私のループ内で、私は(「現在」)3番目の変数を宣言する必要がある理由しかし、私はまだ理解していない

// Fibonacci generator 
 
function* fibonacci() { 
 
    var a = 0; 
 
    var b = 1; 
 
    while (true) { 
 
    var current = a; 
 
    a = b; 
 
    b = current + a; 
 
    yield current; 
 
    } 
 
} 
 

 
// Instantiates the fibonacci generator 
 
var fib = fibonacci(); 
 

 
// gets first 10 numbers from the Fibonacci generator starting from 0 
 
for (let i = 0; i < 10; i++) { 
 
    console.log(i + ' => ' + fib.next().value); 
 
}

を:私はこれがそうすることによって動作するようになってきました望ましい結果を得ることができる。何か案は?

編集:皆さんは正しいです。問題は、変数が2つのステップで割り当てられていて、それゆえ望ましい値を得ていないことです。ここで私は今後の参考のために掲載することを決めた決勝、作業コードは、です:

// Fibonacci generator 
 
function* fibonacci() { 
 
    [a, b] = [0, 1] 
 
    while (true) { 
 
    yield a; 
 
    [a, b] = [b, a + b] 
 
    } 
 
} 
 

 
// Instantiates the fibonacci generator 
 
var fib = fibonacci(); 
 

 
// gets first 10 numbers from the Fibonacci generator starting from 0 
 
for (let i = 0; i < 10; i++) { 
 
    console.log(fib.next().value); 
 
}

はどうもありがとうございました!

+0

あなたはあなたが間違っていると思うことを説明できますか?さらに良いことに、失敗したテストを追加して何が間違っているのか説明できますか?また、stackovflowを使用すると、実行可能なウィジェットにコードを埋め込むことができるため、誰でも簡単に追加したいテストを実行し、実際に何が間違っているのかを見ることができます。 –

+4

'b = a + b'ではすでに' a = b'を設定しているので、これは単に 'b = 2 * b'です。代わりに2つの代入を(Pythonの場合のように)同時に行うには、 '[a、b] = [b、a + b]'を実行するとよいでしょう。 – Frxstrem

答えて

7

あなたの元のコードは、Pythonにあった場合、あなたはおそらく、このようなステートメントを持っていた:

a, b = b, a + b 

これはフィボナッチのために予想される動作である、同時にa + bbbからaを設定しますシーケンス。あなたは、このコードはJavaScriptに変換するときに、2つのステップにそれを分割している

ただし、この場合には

a = b 
b = a + b 

、最初の割り当ては、その後第二1を最初に行われており、。つまり、2番目の割り当ては最初の割り当ての影響を受けます。これがどうやって間違っているかを見るには、a = 0, b = 1の場合を考えてみましょう。これらの譲渡の後、我々はa = 1, b = 1(1は次のフィボナッチ数なので)を期待する。しかし:

// a = 0, b = 1 
a = b 
// a = 1, b = 1 
b = a + b 
// a = 1, b = 2 

明らかに間違っています。

あなたは(あなたがすでに発電機を使用しているので、あなたが、やることは非常に可能性が高いです)ES6を使用している場合は、あなたが実際に配列destructuingを使用してPythonの文に類似し、これを書くことができます:

[ a, b ] = [ b, a + b ] 
関連する問題