反向和外接程序JavaScript
我一直在用javascript开发一个算法,它解决了一个“反向添加”问题。我已经在脑海中解决了这个问题,它应该会起作用,但每当我尝试在JSFIDLE中运行它时,它就会变得毫无反应。我认为这可能是一个无限循环,但我不知道为什么。代码如下: HTML反向和外接程序JavaScript,javascript,html,Javascript,Html,我一直在用javascript开发一个算法,它解决了一个“反向添加”问题。我已经在脑海中解决了这个问题,它应该会起作用,但每当我尝试在JSFIDLE中运行它时,它就会变得毫无反应。我认为这可能是一个无限循环,但我不知道为什么。代码如下: HTML <p id="test"></p> 下面的代码一直在反转变量 while(x != reverse(x)) { x =+ reverse(x) } 如果你运行reverse(124)你会得到421。如果运行r
<p id="test"></p>
下面的代码一直在反转变量
while(x != reverse(x)) {
x =+ reverse(x)
}
如果你运行reverse(124)
你会得到421
。如果运行reverse(421)
将得到124
。现在,让我们看看会发生什么:
从x=124
开始,我们进入循环:
x!=反向(x)
=>
124!=反向(124)
=>
124!=421
=>
true
x=+反向(x)
=>
x=+reverse(124)
=>
x=+421
=>
x=421
x!=反向(x)
=>
421!=倒车档(421)
=>
421!=124
=>
true
x=+反向(x)
=>
x=+反向(421)
=>
x=+124
=>
x=124
当你说你正在试图解决“反向添加”问题时,我理解你实际上想要添加 也就是说,
=+
可能是一个打字错误,您需要的是+=
。这将需要124
将其反转为421
添加它以获得545
,然后它与它的反转不再不同。类似于什么
相反,形式为
x=+value
的代码在value
上做一个一元+
,然后它将该值赋给x
,您应该从while循环中出来,现在发生的是您正在反转“124”
,然后将其添加到“421”
,结果是545
,while循环再次向前推进,以检查x!=“545”等等
var x = 124;
function reverse(n) {
for(var r = 0; n; n = Math.floor(n / 10)) {
r *= 10;
r += n % 10;
}
return r;
}
while(x != reverse(x)) {
x = x + reverse(x);
break;
}
console.log("x", x);
=+
不是运算符,+=
是运算符
反向和添加算法可用于测试。使用正确的+=
运算符是不够的。如果一个数字是一个Lychrel数字,循环将永远不会结束。在这个片段中,测试了20个随机数的“Lychrelness”,最多25次迭代。它使用简化的反向方法和es6(又称es2015)
const test=document.querySelector(“#test”);
常量反向=(n,r)=>n?反向(n/10 | 0,(r | 0)*10+n%10):r;
const someRandomNumbers=Array.apply(null,{length:20})
.map(()=>Math.floor(99999*Math.random()+1));
const isLychrel=num=>{
设迭代次数=0;
设rev=0;
while(num!==rev&&iterations<25){
迭代次数+=1;
num+=rev;
rev=反向(num);
}
返回“${iterations==25?”*可能是Lychrel:num}”;
};
一些随机数。forEach(
n=>test.textContent+=`${n}=>${isLychrel(n)}\n`
);代码>
虽然我看到您发现了语法错误,但我认为解决方案的实现方式很难发现。反向也被称为多次
如果您需要反转和添加,我更喜欢最简单的解决方案和更具声明性的方法,使用更简单的片段和更具语义的变量名,这将有助于更轻松地读取代码,从而发现像这样愚蠢的错误
例如:
function reverse(num, carry = 0) {
const left_over = Math.floor(num / 10);
const result = num % 10 + carry;
if (left_over === 0) {
return result;
}
else {
return reverse(left_over, result * 10);
}
}
document.getElementById("test").innerHTML = String(421 + reverse(421));
在while
循环中,您得到的是=+
而不是+=
。我不知道你为什么认为你需要while
循环而不是x=reverse(x)代码>。编辑哦,等等,我明白了。但是,=+
并不是一个语法错误,但它肯定与+=
不同x=+reverse(x)
等同于x=+reverse(x)
<带有一个参数的code>+
相当于0+数字(参数)
。这就是x=0+Number(逆(x))
。由于x
已经是一个数字,它只是x=reverse(x)
。您应该将reverse(x)
的结果缓存在变量中。您将重复相同的操作两次。
function reverse(num, carry = 0) {
const left_over = Math.floor(num / 10);
const result = num % 10 + carry;
if (left_over === 0) {
return result;
}
else {
return reverse(left_over, result * 10);
}
}
document.getElementById("test").innerHTML = String(421 + reverse(421));