JavaScript .push() 添加到两个数组中



我想找到 100 以下最长的 collatz 序列序列序列,并且此代码输出 2,这不是答案。 当我观察变量时,每当 .push(( 函数向测试中添加一些东西时,它也会添加到最大值。为什么要在两者的末尾添加一个值?

var n;
var m;
var testary = [];
var maxary = [];
var max;
for(i=2;i<100;i++){
n = i;
m = i;
while(n>1){
if(n%2 == 0){
testary.push(n);
n = n/2;
}   else if(n%2 != 0){
testary.push(n);
n = (3*n)+1;
}
if(testary.length>maxary.length){
maxary = testary;
max = m;
}
}}

当你分配maxary = testary时,它会将testary的引用分配给maxary,每当你尝试使用push将项目添加到其中任何一个时,它都会影响两个数组,因为值在javascript中的引用处被更改

您可以在使用spread syntax分配之前克隆阵列

var n;
var m;
var testary = [];
var maxary = [];
var max;
for(i=2;i<100;i++){
n = i;
m = i;
while(n>1){
if(n%2 == 0){
testary.push(n);
n = n/2;
}   else if(n%2 != 0){
testary.push(n);
n = (3*n)+1;
}
if(testary.length>maxary.length){
maxary = [...testary]; // clone the array
max = m;
}
}}

有趣的小谜题。以前从未听说过科拉茨。这是我的看法。它将返回前 10 个序列长度,并显示"获胜"序列。

var arr,i,n,testary=[];
for(i=2;i<100;i++){ arr=[];n=i;
do arr.push(n); 
while ( (n = n%2 ? (3*n)+1 : n/2) >1 );
testary.push(arr);
}
testary.sort((a,b)=>b.length-a.length).slice(0,10).forEach(e=>console.log(e[0],e.length))
// show longest found sequence:
console.log(testary[0].join(', '))