私はES6で(node-esmlを通して)簡単なGCDアルゴリズムを実装していましたが、whileループの中で変数の値を更新すると奇妙な動作をしました。このコードは素晴らしいです:ES6関数のwhileループでのデストラクタリングの代入は、ループから外れていませんか?
function gcdWithTemp(x, y) {
let [r, rdash] = [x, y]
while (r != 0) {
q = Math.floor(rdash/r)
temp = r
r = rdash - q * r
rdash = temp
}
return(rdash)
}
console.log(gcdWithTemp(97, 34))
1
の期待値を返します。私は一時変数を削除し、代わりに同じ結果を試み、達成するために分割代入を使用する場合は、:
function gcdWithDestructuredAssignment(x, y) {
let [r, rdash] = [x, y]
while (r != 0) {
q = Math.floor(rdash/r)
[r, rdash] = [rdash - q * r, r]
}
return(rdash)
}
console.log(gcdWithDestructuredAssignment(97, 34))
それが完了したことがない、さらにデバッグはrが常にx
、に割り当てられた最初の値を持つことを示しています。これらの2つの実装は同一である必要がありますか? Swapping variables
var
の代わりにlet
の代わりに使ってみました。私は徹底的に任務を破棄したり、微妙なものを見逃したりするという誤解をしていますか?それともバグですか?
あなたの 'q'変数と' temp'変数は[暗黙的にグローバル]です(http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html)。厳密なモードを使用してください! – Bergi
Btw、 '関数gcd(r、rdash){'を書いて 'let [r、rdash] = [x、y]'を省略するのはどうですか? – Bergi