我的代码冻结了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);
为什么会崩溃?我该如何预防?
谢谢你们!
答案 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所示:
剧透警报 - 这是一个带有额外逻辑的递归函数的工作示例:
"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;
在函数内部,因此它将在每次运行中从零开始。
最终结果:
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;