【问题标题】:Javascript : if statement is not working on while/for loopJavascript:if 语句在 while/for 循环中不起作用
【发布时间】:2021-05-04 15:45:50
【问题描述】:

下面的代码一直在工作,直到在循环中添加条件。

<html>
<body>
<!-- This code is working--> 
<script>
var n=parseInt(prompt("Enter a number:"));
while(n>=1){
    document.write(n+' /  2<br>');
    n=n/2;
    }
</script>
</body>
</html>

但是当我添加条件时,同样的代码没有运行:

<html>
<body>
    <!-- This code is not working -->
<script>
var n=parseInt(prompt("Enter a number:"));
while(n>=1){
    if(n%2!=0){
        n=3*n+1; 
        }
    document.write(n+' /  2<br>');
    n=n/2;
    }
</script>
</body>
</html>

【问题讨论】:

  • 你用调试器单步执行了吗?
  • 调试器在我尝试运行时挂起/崩溃。(同样的事情发生在多个设备上)
  • 您的代码运行。它永远不会停止。
  • 对了,你能告诉我为什么会这样吗?
  • 问题在于3*n+1,通过删除它可以正常工作。需要检查错误在哪里

标签: javascript while-loop conditional-statements


【解决方案1】:

我找到了答案

<html>
<body>
<script>
var n=parseInt(prompt("Enter a number:"));
while(n>=1){
    if(n%2!=0){
        n=n+1; 
        }
    console.log(n);
    n=n/2;
    if(n==1){break;}//this will stop Infinity loop 
    }
</script>
</body>
</html> 

【讨论】:

    【解决方案2】:

    您的代码无法正常工作,因为 while 循环将永远不会停止运行,因为 n 将始终大于 1。

    为什么?因为你将它乘以 3,然后除以 2,这实际上增加了给定的 n。

    例如,如果n = 5 在第一种情况下,

    它将是n = 3*n+1 = 16 然后n = n/2 = 8

    如您所见,第一个 n = 5 变为 n = 8。因此它永远不会中断 while 循环,因为 n 永远不会减少到 0。即使看起来对于 n = 8,下一次迭代将是

    n = 4 // 8%2 == 0 n = 2 // 再次 4%2 == 0 n = 1// as 2%2 == 0

    现在 1%2!==0 现在将执行 if 语句,

    所以, n = 4 因为 n = 3n+1 => 3*1 + 1 => 4;

    现在它将再次进入相同的路径。 n = 4 n =2 n =1 n=4 n=2 n=1

    因此它永远不会退出 while 循环并无限运行。

    更新:

    要删除无限循环,您需要将 while 循环的条件更改为 while(n>1)。而且你需要写 n = Math.round(n/2) 而不是 n = n/2 因为 n/2 可能会导致浮点数。

    【讨论】:

    • 你的例子和解释有缺陷。数字 6 不会应用多项式,因为它是偶数。编辑您的答案以表明奇数将始终增加,并且您走在正确的轨道上。
    • 如果我使用n=n+1 而不是n=3*n+1,也会发生同样的事情
    • 只需在控制台中添加一个console.log(n) 并检查n 的值。你会明白问题出在哪里。
    • @sabbir.alam 当 n 的值达到 2 时它不会停止
    • 它不应该像我上面描述的那样停止,它将是一个无限循环。要删除无限循环,您需要将 while 循环的条件更改为 while(n>1)。你需要写 n = Math.round(n/2) 而不是 n = n/2 因为 n/2 可能会导致浮点数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多