变量不会在while循环中改变

时间:2017-12-30 05:48:39

标签: javascript variables while-loop

我正在尝试挑战,以便练习,学习和更好地理解编码。我遇到了一个难,并决定尝试,只是为了看。幸运的是没有时间限制。挑战是(如果你愿意,你可以跳过)

&#34;使用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。&#34; < / p>

(coderbyte)

工作了很长一段时间后,我发现了一些我想象的东西会起作用。虽然我无法测试循环,因为如果我这样做,我无法重新运行代码,因为循环不完整,永远不会完成处理。完成后,我测试了它。不管我做了什么,我都得0。如果我输入了字母,我会收到错误,会发生什么,但无论我输入什么数字,即使是示例中的4位数字。

这是我的代码:

&#13;
&#13;
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()); 
&#13;
&#13;
&#13;

我刚开始,所以我真的不知道这里有什么问题。如果有人能告诉我出了什么问题,我会很高兴。 (我知道这听起来似乎我似乎并不理解其中任何一个,但我真的只是没有掌握我所学到的一切。我在短时间内学会了这一切。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

以下将解决问题,第一个版本实际上并不是要求的实现,但这个是。

我使用了以下内容:

  1. 递归(函数调用自身直到达到预期结果)

  2. Array.fromNumber.prototype.toString以确保数字字符串的长度为4个字符。

  3. Ternary operator,其方向是sortNum的参数,可以升序或降序排序。

  4.     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;
    }