2017-12-30 40 views
0

私は、コーディングを練習し、学び、理解するために挑戦しています。私は一生懸命やって来て、見てみることにしました。幸いなことに時間制限はありません。あなたが望むならスキップすることができます。whileループで変数が変化しない

"JavaScript言語を使って、関数のKaprekarsConstant(num)に少なくとも2つの異なる数字を持つ4桁の数値が渡されます。プログラムは数字の次のルーチンを実行する必要があります。数字を降順と昇順(4桁の数値に合わせてゼロを加算)に配置し、大きい方の数字から小さい方の数値を引きます。このルーチンを実行すると、常に6174に固定された番号に到達します。次に、6174でルーチンを実行すると、常に6174(7641-1467 = 6174)が返されます。たとえば、numが3524の場合、プログラムは次のステップのために3を返します。(1)5432 - 2345 = 3087、(2)8730 - 0378 = 8352 、(3)8532-2358 = 6174。

(coderbyte)

長い間働いた後、私は私が仕事想像何かを発見しました。ループをまだテストすることはできませんでした。なぜなら、ループが不完全で処理が完了しないため、コードを再実行できなかったからです。それがすべて終わった後、私はそれをテストしました。そして私は何を試しても0を得ました。私が手紙を入力した場合、何が起こるべきか、たとえ数字が何であっても、この例の4桁の数字さえも誤りがあります。私はちょうど始めていますので、私は本当にここに間違っているかわからない

function KaprekarsConstant(num) { 
 
    var forD = []; 
 
    var sNum = num.toString(); 
 
    var result = 0; 
 
    var chngdN = []; 
 
    var trkr = 0; 
 
    
 
for (var i = 0; i < sNum.length; i ++) { 
 
    forD.push(+sNum.charAt(i)); 
 
} 
 

 
for (var j = 0; j < sNum.length; j ++) { 
 
    chngdN.push(+sNum.charAt(j)); 
 
} 
 
     while(while(forD-chngdN === trkr){ 
 
    forD = trkr.toString(); 
 
    chngdN = trkr.toString(); 
 
    forD = forD.split(""); 
 
    chngdN = chngdN.split(""); 
 
    forD = forD.sort(); 
 
    chngdN = chngdN.sort(); 
 
    forD = forD.reverse(); 
 
    forD = forD.join(""); 
 
    chngdN = chngdN.join(""); 
 
    forD = parseFloat(forD); 
 
    chngdN = parseFloat(chngdN); 
 
    trkr = forD - chngdN; 
 
    forD = trkr.toString(); 
 
    chngdN = trkr.toString(); 
 
    result = result +1; 
 
} 
 
    // code goes here 
 
    return result; 
 
      
 
} 
 
    
 
// keep this function call here 
 
KaprekarsConstant(readline());

は、ここに私のコードです。誰かが私に何が間違っているか教えてもらえれば、それは大好きです(私はそれが私がそれを理解していないように見えるように思えるように思えるように思えるが、私はまだ学んだすべてをしっかり把握していない。 )。 ありがとうございます。

答えて

0

次の問題を解決します。最初のバージョンは、実際には要件の実装ではありませんが、これは1つです。

私はこのために、次の使用:

  1. は再帰(機能望ましい結果になるまで自分自身を呼び出す)

  2. Array.fromNumber.prototype.toString数文字列が4文字の長さを確認します。

  3. Ternary operatorこれは、昇順または降順に並べ替えるsortNumの引数です。

const makeAtLeast4 = num => 
 
     //number to string make sure you have a string that's 4 characters (add 0 if not) 
 
     num.toString() + 
 
     Array.from(//create an array from someghing 
 
      new Array(//that something is a new array 
 
      //the lenght of this array is 4 minus the length of the string 
 
      4-num.toString().length), 
 
      ()=>"0"//for each item of the array insert the string "0" 
 
     ).join("");//join this array (num 111 will be sring "1110") 
 
    //create ascending or descending sorted number 
 
    // if direction is 1 it's ascending 
 
    const sortNum = (numString,direction) => 
 
     parseInt(
 
     (direction === 1) 
 
     //if direction is 1 do ? else do : 
 
      ? numString.toString().split("").sort().join("") 
 
      : numString.toString().split("").sort().reverse().join("") 
 
     ,10//decimal number 
 
    ); 
 
    //take number, sort digits descending and ascending 
 
    // substract ascending from descending 
 
    const descending_minus_ascending = num => { 
 
     const stringNum = makeAtLeast4(num); 
 
     return sortNum(stringNum) - sortNum(stringNum,1) 
 
    } 
 
    const kaprekarsConstant = (num,times=0) => { 
 
     //get result for this number 
 
     const result = descending_minus_ascending(num); 
 
     //if result is the same as the number, return times tried 
 
     if(result === num){ 
 
     return times 
 
     } 
 
     console.log(`Try:${times+1}, result:${result}`); 
 
     //try again with the result and increase times tried by one 
 
     // recursively call this function 
 
     return kaprekarsConstant(result,times+1); 
 
    } 
 

 
    console.log(kaprekarsConstant(11))

ここ[UPDATE]

は、whileループのようにコードであるあなたが再帰を使用するまで、私はループのいずれかの種類を避けるために、あなたをアドバイスう配列の関数では、学習に少し時間がかかるかもしれませんが、長期的にはコードを分かりやすく書くことができます:

const kaprekarsConstant = (num) => { 
    //get result for this number 
    // !! notice that result is not a constant but a var 
    // we will have keep re assigning it, this can be confusing 
    // in complex code and should be avoided if possible 
    // with recursion we don't need to do this 
    var result = descending_minus_ascending(num); 
    var times=0; 
    //keep re assigning result until it's same as num 
    while(result !== num){ 
    console.log(`Try:${times+1}, result:${result}`); 
    result = descending_minus_ascending(num); 
    } 
    return times; 
} 
+0

すみません、私はちょっと迷っています。私が知っている範囲は、var、function、return、array、some()(私は正直なところ、splitというように何が呼ばれているのか分かりません。 ))、すべての===!==など、if、for、whileループ、.match、parseInt、parseFloat、そしておそらくそれ以上のものは今私の心を傷つけています。私はプッシュフレーズがどのように働いたか、彼らがしたことだけを完全には理解していなかったことを認めます。すみません、あなたがしていることを見て、どうして本当に理解していないのか分かります。 –

+0

また、私は失礼なことを意味するわけではありませんが、私が書いたことで何が間違っているかを知っていれば、学習にとって非常に便利です。 –

+0

@BradenFoltz主なことは、あなたが再帰を使わないことです。私は少し簡単にするために私の答えを更新し、より正確に仕様を実装しました。 – HMR

関連する問題