JavaScript 中的 Collat​​z 猜想

每个人!我正在为学校解决这个问题。我需要计算从任何正整数到 1 需要多少步。而且我应该使用 TypeScript。 Collat​​z 猜想或 3x+1 问题可以总结如下: 取任意正整数 n。如果 n 是偶数,将 n 除以 2 得到 n / 2。如果 n 是奇数,将 n 乘以 3 并加 1 得到 3n + 1。无限重复该过程。该猜想表明,无论您从哪个数字开始,最终总会达到 1。这是我对代码的猜测:

function steps(n: number) {
    let counter: number = 0;
    if (n > 0 && Number.isInteger(n)) {
        while (n !== 1) {
            if (n % 2 === 0) {                                      
                n = n / 2; 
                counter++;
            } else if (n % 2 !== 0) {
                n = (n * 3) + 1;
                counter++;
            }
            return counter;
        }
    } else {
        throw new Error('Only positive whole numbers are allowed');
    }
}

我希望我的代码尽可能透明,这就是我可能编写太多代码的原因。别介意。

stack overflow Collatz conjecture in JavaScript
原文答案

答案:

作者头像

这是正确的。回报不合适。它应该在while循环之外。

function steps(n: number) {
    let counter: number = 0;
    if (n > 0 && Number.isInteger(n)) {
        while (n !== 1) {
            if (n % 2 === 0) {                                      
                n = n / 2; 
                counter++;
            } else if (n % 2 !== 0) {
                n = (n * 3) + 1;
                counter++;
            }
        }
        return counter;
    } else {
        throw new Error('Only positive numbers are allowed');
    }
}
作者头像

嗨,我尝试在 Visual Studio 代码中对此进行测试,为什么它不起作用?

function steps(n: number) {
let counter: number = 0;
if (n > 0 && Number.isInteger(n)) {
    while (n !== 1) {
        if (n % 2 === 0) {                                      
            n = n / 2; 
            counter++;
        } else if (n % 2 !== 0) {
            n = (n * 3) + 1;
            counter++;
        }
    }
    return counter;
} else {
    throw new Error('Only positive numbers are allowed');
}

}

作者头像
  • 永远无法解决的数学问题:Collat​​z 猜想或 3x+1

  • 它将以 4-2-1 循环结束并且永无止境

  • 只应用两条规则

  • 如果数字是奇数乘以 3 并加 1

  • 如果数字是偶数除以 2

  • 即使数字是 2^68 的万亿分之一,它最终也会以 4-2-1 循环结束

    const collat​​z_conjecture = (数字) => {

     setTimeout(() => {
         console.log(`Number: ${number}`);            
         if (number % 2 === 0) {
             //even
             console.log(`Number is even: ${number} - dividing by 2`);            
             number = (number / 2);
         } else {
             //odd
             console.log(`Number is odd: ${number} - multiplying by 3 and than adding 1`);
             number = (number * 3) + 1;
         }
    
         collatz_conjecture(number);
    
     }, 3 * 1000); // 3 seconds delay    
    

    };

    collat​​z_conjecture(10);