簡體   English   中英

變量在while循環中不改變

[英]variable not changing in while loop

我正在嘗試挑戰,以便練習,學習和更好地理解編碼。 我遇到了困難,決定嘗試一下,只是為了看看。 幸運的是沒有時間限制。 挑戰是(您可以根據需要跳過)

“使用JavaScript語言,使函數KaprekarsConstant(num)接受傳遞的num參數,該參數將是一個4位數字,至少包含兩個不同的數字。您的程序應對該數字執行以下例程:將數字降序排列按升序(將零添加到4位數字中),然后從較大的數字中減去較小的數字,然后重復上一步。執行此例程將始終使您達到固定的數字:6174。然后在6174上執行例程將始終為您提供6174(7641-1467 = 6174)。您的程序應返回該例程必須執行的次數直到達到6174.例如:如果num為3524,則您的程序應返回3,因為以下步驟之一:(1)5432-2345 = 3087,(2)8730-0378 = 8352,(3)8532-2358 =6174。”

(編碼字節)

工作了很長一段時間后,我發現了一些我想像的東西。 不過,我還無法測試循環,因為如果這樣做,我將無法重新運行代碼,因為循環不完整並且永遠無法完成處理。 全部完成后,我對其進行了測試。 不管我嘗試什么,我都得到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()); 

我才剛剛開始,所以我真的不知道這里出了什么問題。 如果有人可以告訴我出了什么問題,我會喜歡的。 (我知道這聽起來似乎是我似乎不了解其中任何一個,但是我真的只是對所學到的一切都沒有足夠的了解。我很快就學會了這一切。 )。 先感謝您。

下面將解決問題,第一個版本實際上不是要求的實現,而這個是。

我為此使用了以下內容:

  1. 遞歸(函數自行調用,直到獲得所需的結果)

  2. Array.fromNumber.prototype.toString以確保數字字符串的長度為4個字符。

  3. 方向的三元運算符 ,是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)) 

[更新]

這是作為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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM