我的代码崩溃了javascript控制台

时间:2018-04-17 04:22:29

标签: javascript

我的代码冻结了Chrome(和Firefox),在Coderbyte控制台上无法执行,但当我提交代码作为练习的答案时,确实需要。

var numOrdered = 0;
var numReversed = 0;
var tries = 0;
function KaprekarsConstant(num) {
  var arr = [];
  while (num > 0) {
    arr.unshift(num % 10);
    num = num / 10 | 0;
  }
  arr.sort();
  numOrdered = Number(arr.join(''));
  numReversed = Number(arr.reverse().join(''));

  while (num !== 6174) {
    num = numReversed - numOrdered;
    tries += 1;
  }
  return tries;
};

KaprekarsConstant(8593);

为什么会崩溃?我该如何预防?

谢谢你们!

6 个答案:

答案 0 :(得分:0)

实际问题是第二个while循环:

while (num !== 6174) {
  num = numReversed - numOrdered;
  tries += 1;
}

删除它,您的代码不会挂起浏览器:

var numOrdered = 0;
var numReversed = 0;
var tries = 0;
function KaprekarsConstant(num) {
  var arr = [];
  while (num > 0) {
    arr.unshift(num % 10);
    num = num / 10 | 0;
  }
  arr.sort();
  numOrdered = Number(arr.join(''));
  numReversed = Number(arr.reverse().join(''));

  
  return tries;
};

console.log(KaprekarsConstant(8593));

您需要重新审视第二个循环中的逻辑,以使其不会变为无限。

答案 1 :(得分:0)

第二个循环使您的代码挂起。试试这个。我做了一些改变。

var numOrdered = 0;
var numReversed = 0;
var tries = 0;
function KaprekarsConstant(num) {

  while (num !== 6174) {
     var arr = [];
    while(num >0){  
    arr.unshift(num % 10);
    num = num / 10 | 0;
  }
  arr.sort();
  numOrdered = Number(arr.join(''));
  numReversed = Number(arr.reverse().join(''));
  num = numReversed - numOrdered;
  tries += 1;
  }
  return tries;
};

KaprekarsConstant(8593);

答案 2 :(得分:0)

帖子中的while循环一直在计算num的相同值,所以它不是立即6174,循环会永远持续。

基本上,代码不遵循用于演示Kaprekar常量的算法,如Wikipedia所示:

  • 使用前导零填充小于4位的数字,
  • 从{number,带倒数的数字)和
  • 中减去较小的数字
  • 从最新减法结果中提取数字的步骤重复。

剧透警报 - 这是一个带有额外逻辑的递归函数的工作示例:

"use strict";

function KaprekarsConstant(num, tries=0) {

  if( num == 6174)  // Kaprekar's constant.
     return tries;
  if( num == 0)     // degenerate case, digits are the same
     return -tries;

  var arr = [];
  while (num > 0) {
    arr.unshift(num % 10);
    num = num / 10 | 0;
  }
  while( arr.length<4) {  // leading zeroes as required
    arr.unshift(0);
  }
  arr.sort();
  var numOrdered = Number(arr.join(''));
  var numReversed = Number(arr.reverse().join(''));

  num = Math.abs( numOrdered - numReversed)  // larger - smaller
  return KaprekarsConstant( num, ++tries);   // try again
};

// and test
function test() {
  var num = Number(input.value);
  if( Number.isNaN(num) || num < 1 || num > 9999) {
    throw new Error("Enter number between 1 and 9999");
  }
  console.log("Tries = %s", KaprekarsConstant(num)  );
}
<label> Enter 1 to 4 digit number: <input type="text" id="input"></label><br>
<button type="button" onclick="test()">Calculate tries</button>

答案 3 :(得分:0)

虽然答案确实解决了您的问题,但解决方案和代码缺少关于前导零的部分,如wiki Kaprekar's constant 整个解决方案非常简单

function KaprekarsConstant(num)
{
    var tries=0;
    var numOrdered =0;
    var numRevesed=0;
    while(num!=6174)
    {
        numOrdered=("0000" + num).substr(-4,4).split("").sort().join("");
        numRevesed=numOrdered.split("").reverse().join("");
        num = numRevesed-numOrdered;
        tries+=1;
    }
    return tries;
}
KaprekarsConstant(8593);

答案 4 :(得分:0)

为什么会崩溃?&#39;,这可能是由于无限循环

我尝试运行代码时收到的响应

Possible infinite loop detected. 
Error: Infinite loop
    at KaprekarsConstant (script 19:68)
    at script 27:1 

答案 5 :(得分:0)

谢谢大家的答案!

感谢 @Jaromanda X 我意识到最后一个while循环是无限的,因为

num = numOrdered - numReversed;

总是一样的。

我意识到每次都必须重新排列数字,所以我为它创建了一个函数并将其合并到while循环中。

我还添加了一些来自 @ traktor53 的代码,以便在数字少于4位的情况下添加前导零。

完成后我宣布

var tries = 0;

在函数内部,因此它将在每次运行中从零开始。

最终结果:

&#13;
&#13;
var numOrdered = 0;
var numReversed = 0;

function KaprekarsConstant(num) {
  var tries = 0;
  function order(num) {  // function to order the numbers
    var arr = [];
    while (num > 0) {
      arr.unshift(num % 10);
      num = num / 10 | 0;
    }
    while(arr.length<4) {  // leading zeroes as required
    arr.unshift(0);
  }
    arr.sort();
    numOrdered = Number(arr.join(''));
    numReversed = Number(arr.reverse().join(''));
  }

  while (num !== 6174) {
    order(num);
    num = Math.abs(numOrdered - numReversed);  // larger - smaller
    tries += 1;
  }
  return tries;
};

KaprekarsConstant(8593);
&#13;
&#13;
&#13;