【问题标题】:javascript .push() adding to two arraysjavascript .push() 添加到两个数组
【发布时间】:2020-05-17 13:59:43
【问题描述】:

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

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;
    }
}}

【问题讨论】:

  • 尝试使用调试模式(F12)

标签: javascript arrays push


【解决方案1】:

当您分配 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;
    }
}}

【讨论】:

    【解决方案2】:

    有趣的小谜题。以前从未听说过科拉茨。这是我的看法。它将返回前 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(', '))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 2020-10-22
      • 1970-01-01
      • 2018-08-28
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多