Collatz 序列长度
Collatz sequence length
我正在尝试为小于 100 的数字找到最长的 Collatz 序列,但是有一个我找不到的错误,它使我的代码崩溃:
var longest=0; //holds the biggest m
var m=0; //count of steps for at given n
//in the following, the counter var starts the sequence by giving it's
//value to n, then n loops the sequence. When loop finishes as n == 1, new
//number is looped (n = counter++)
for(var counter = 2; counter <100; counter++){
var n = counter;
while(n!= 1){ //when n==1, loop should stop
if(n%2 == 0){
n = even(n);
m++;
}
if(n%2 != 0){
n = odd(n);
m++ ;
}
}
if(m>longest){
longest = m;
}
m = 0; // resets m counter of steps in loop for new number to loop
}
function even(k){
return k/2;
}
function odd(k){
return 3*k+1;
}
为什么我的代码会崩溃?
您应该考虑在 while 循环中使用 n
而不是计数器,并且您还需要使用 if-else
而不是 if-if
。
if(n%2 == 0){
n = even(n);
m++;
}
else{
n = odd(n);
m++ ;
}
因为 n
会在 while 循环中发生变化,而不是计数器。你基本上是在 while 循环之前重置 n
的值。所以你应该检查 n
的 运行 值。
Collatz 序列只是在每个步骤中根据它的奇偶校验执行操作。
我正在尝试为小于 100 的数字找到最长的 Collatz 序列,但是有一个我找不到的错误,它使我的代码崩溃:
var longest=0; //holds the biggest m
var m=0; //count of steps for at given n
//in the following, the counter var starts the sequence by giving it's
//value to n, then n loops the sequence. When loop finishes as n == 1, new
//number is looped (n = counter++)
for(var counter = 2; counter <100; counter++){
var n = counter;
while(n!= 1){ //when n==1, loop should stop
if(n%2 == 0){
n = even(n);
m++;
}
if(n%2 != 0){
n = odd(n);
m++ ;
}
}
if(m>longest){
longest = m;
}
m = 0; // resets m counter of steps in loop for new number to loop
}
function even(k){
return k/2;
}
function odd(k){
return 3*k+1;
}
为什么我的代码会崩溃?
您应该考虑在 while 循环中使用 n
而不是计数器,并且您还需要使用 if-else
而不是 if-if
。
if(n%2 == 0){
n = even(n);
m++;
}
else{
n = odd(n);
m++ ;
}
因为 n
会在 while 循环中发生变化,而不是计数器。你基本上是在 while 循环之前重置 n
的值。所以你应该检查 n
的 运行 值。
Collatz 序列只是在每个步骤中根据它的奇偶校验执行操作。