2016-10-15 9 views
1

私はJavaScriptのアルゴリズムを使って "逆引き問題"を解決しています。私は頭の中でそれを試しました。でなければなりませんが、JSFiddleで実行しようとするたびに応答しなくなります。私はそれが無限ループであるかもしれないと思うが、私はなぜそれほどよく分からない。ここでは、コードです:あなたがreverse(124)を実行する場合逆引きとJavaScriptでの追加

HTML

<p id="test"></p> 

JAVASCRIPT

var x = 124; 
function reverse(n) { 
    for(var r = 0; n; n = Math.floor(n/10)) { 
     r *= 10; 
     r += n % 10; 
    } 
    return r; 
} 
while(x != reverse(x)) { 
     x =+ reverse(x) 
} 
document.getElementById("test").innerHTML = x 
+3

あなたは '= +'の代わりに '+ =' '持っwhile'ループで。私は 'x = reverse(x);ではなく' while'ループが必要であると思う理由がわかりません。 *編集*ああ待っています。しかし、 '= +'は構文エラーではありませんが、 '+ ='とまったく同じではありません。 – Pointy

+0

'x = + reverse(x)'は 'x = + reverse(x)'に相当します。 1つの引数を持つ '+ 'は' 0 + Number(argument) 'と等価です。それは 'x = 0 + Number(reverse(x))'です。 'x'はすでに数値なので' x = reverse(x) 'だけです。 – Barmar

+0

'reverse(x)'の結果を変数にキャッシュする必要があります。同じ操作を2回繰り返しています。 – Oriol

答えて

1

は、以下のコードは、変数

while(x != reverse(x)) { 
     x =+ reverse(x) 
} 

を逆転し続けます421になります。 reverse(421)を実行すると、124となります。それでは、何が起こるか見てみましょう:

  1. x != reverse(x) => 124 != reverse(124) => 124 != 421 => true

  2. x =+ reverse(x)

    x = 124を皮切りに、我々は、ループを入力してください=> x =+ reverse(124) => x =+ 421 => x = 421

  3. x != reverse(x) => 421 != reverse(421) => 421 != 124 => true

  4. x =+ reverse(x) => x =+ reverse(421) => x =+ 124 => x = 124

とバック1.


に進むあなたが「逆にして、追加」問題を解決しようとしていることを言うとき、私はあなたが実際にしたいことを理解しを追加します。

つまり、=+はおそらくタイプミスです。お望みのものは+=です。それは124421に戻し、それを加えて545とし、それとは逆のものではなくなりました。類似のものと同じThalaivar explains

代わりに、x =+ valueという形式のコードは、valueの単体+を実行してから、xに割り当てます。

1

あなたはwhileループから出てくるべきでは、何が起こっていることは!=「545」あなたは"124"を逆転された後、545になり"421"に追加し、whileループが再びXかどうかをチェックするために持ち越されているので、に。

var x = 124; 
function reverse(n) { 
    for(var r = 0; n; n = Math.floor(n/10)) { 
     r *= 10; 
     r += n % 10; 
    } 
    return r; 
} 
while(x != reverse(x)) { 
    x = x + reverse(x); 
    break; 
} 

console.log("x", x); 
0

=++=は、オペレーターではありません。

逆方向アルゴリズムと加算アルゴリズムを使用してLychrel numbersをテストすることができます。右の+=演算子を使用するだけでは不十分です。数字のLychrel番号の場合、ループは決して終了しません。このスニペットでは、20個の乱数が 'Lymrelness'のためにテストされます最大25回の反復。それは単純化された逆の方法とes6(別名es2015)を使用します。

const test = document.querySelector('#test'); 
 
const reverse = (n, r) => n ? reverse(n/10 | 0, (r | 0) * 10 + n % 10) : r; 
 
const someRandomNumbers = Array.apply(null, {length: 20}) 
 
      .map(() => Math.floor(99999 * Math.random()+1)); 
 
const isLychrel = num => { 
 
    let iterations = 0; 
 
    let rev = 0; 
 
    while (num !== rev && iterations < 25) { 
 
    iterations += 1; 
 
    num += rev; 
 
    rev = reverse(num); 
 
    } 
 
    return `${iterations === 25 ? '*Maybe Lychrel' : num}`; 
 
}; 
 

 
someRandomNumbers.forEach( 
 
    n => test.textContent += `${n} => ${isLychrel(n)}\n` 
 
);
<pre id="test"></pre>

0

私はあなたが構文のバグを発見した参照が、私は解決策が実装されている方法が発見することが困難になると思います。逆も複数回呼び出されます。

逆にする必要がある場合は、よりシンプルな方法とより簡単な方法で、より意味のある変数名を使用することをお勧めします。コードを読みやすくして、このようなバグを見つけてください。一例として、

function reverse(num, carry = 0) { 
    const left_over = Math.floor(num/10); 
    const result = num % 10 + carry; 
    if (left_over === 0) { 
     return result; 
    } 
    else { 
     return reverse(left_over, result * 10); 
    } 
} 

document.getElementById("test").innerHTML = String(421 + reverse(421)); 
関連する問題