反向和外接程序JavaScript

反向和外接程序JavaScript,javascript,html,Javascript,Html,我一直在用javascript开发一个算法,它解决了一个“反向添加”问题。我已经在脑海中解决了这个问题,它应该会起作用,但每当我尝试在JSFIDLE中运行它时,它就会变得毫无反应。我认为这可能是一个无限循环,但我不知道为什么。代码如下: HTML <p id="test"></p> 下面的代码一直在反转变量 while(x != reverse(x)) { x =+ reverse(x) } 如果你运行reverse(124)你会得到421。如果运行r

我一直在用javascript开发一个算法,它解决了一个“反向添加”问题。我已经在脑海中解决了这个问题,它应该会起作用,但每当我尝试在JSFIDLE中运行它时,它就会变得毫无反应。我认为这可能是一个无限循环,但我不知道为什么。代码如下:

HTML

<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

  • 然后回到步骤1


    当你说你正在试图解决“反向添加”问题时,我理解你实际上想要添加

    也就是说,
    =+
    可能是一个打字错误,您需要的是
    +=
    。这将需要
    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));