2016-09-28 7 views
5

私は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の代わりに使ってみました。私は徹底的に任務を破棄したり、微妙なものを見逃したりするという誤解をしていますか?それともバグですか?

+1

あなたの 'q'変数と' temp'変数は[暗黙的にグローバル]です(http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html)。厳密なモードを使用してください! – Bergi

+1

Btw、 '関数gcd(r、rdash){'を書いて 'let [r、rdash] = [x、y]'を省略するのはどうですか? – Bergi

答えて

7

これは、非構造化割り当てではなく、ASI(自動セミコロン挿入)で問題になります。この2行:

q = Math.floor(rdash/r) 
[r, rdash] = [rdash - q * r, r] 

実際には、この意味:

q = Math.floor(rdash/r)[r, rdash] = [rdash - q * r, r] 

を明らかにあなたが何を意味していません。 、それを修正[の前にセミコロンを追加するには:もちろん

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))

をあなたの代わりに前の行(q = Math.floor(rdash/r);)の終わりにセミコロンを追加することができますが、一般的にドン以来セミコロンを使用しない場合は、npm coding styleを使用していると仮定しました。

+1

不足しているセミコロンを見つけてくださったことをお祈りしていますが、最初の最後のセミコロンではなく、2行目の最初にセミコロンを追加する理由は何ですか? – Aaron

+2

@Aaron [npmコーディングスタイル](https://docs.npmjs.com/misc/coding-style#semicolons)です。 –

+0

ありがとう、喜んでそれを学ぶ。セミコロンを問題のある行の先頭に置くことは、通常は省略され、問題は前の行との集約であれば、実際には意味があります。 – Aaron

関連する問題