JavaScript中的可变长度数组数组

Posted

技术标签:

【中文标题】JavaScript中的可变长度数组数组【英文标题】:Array of variable length array in JavaScript 【发布时间】:2018-04-03 19:27:23 【问题描述】:

我正在构建小型网页来解决著名的河内塔问题。一切都很好,但是当尝试在每个步骤存储三个塔的状态(8 个磁盘的 255 个步骤)时,我尝试使用数组数组或对象数组,其中包含代表每个塔中的磁盘的 3 个数组,但只有存在的状态存储8个磁盘(数组项),否则只有空数组!按照我的代码:

class steps //object that store state of towers at each step

    constructor(src, spr, tgt) 
    
        this.src = src;
        this.spr = spr;
        this.tgt = tgt;
    


function Hanoi(n, source, target, spare)

    if(n>0) 
        Hanoi(n-1, source, spare, target);
        target.push(source.pop());

        document.getElementById('output').innerhtml+= source+ " ;" + spare + " ;" + target + "<br/>"; //print data to see  what is happening

        var obj = new steps(source, spare, target);
        console.log(source, spare, target);

        src_steps.push(obj); //src_steps is global variable
        Hanoi(n - 1, spare, target, source);
    


src = [8, 7, 6, 5, 4, 3, 2, 1];
spr = [];
tgt = [];

Hanoi(8, src, spr, tgt);

问题在于打印的数组包含应有的数据,但是对象数组仅包含包含 8 个项目的数组或空但没有少于 8 个项目的数组!这里发生了什么?

【问题讨论】:

您在函数开头的递归调用没有任何意义。我不知道你是否使用 es6+,但模板字符串会使 document 行更容易理解。 我编辑了问题,希望现在清楚了! @TheIncorrigible1 我的问题与解决方案的逻辑无关,它运行良好,递归函数可以提供所需的解决方案 【参考方案1】:

我无法弄清楚问题的根源是什么,但它似乎与 javascript 对象中的一些深层内容或解释器优化等有关。但是我找到了一个对我有帮助的解决方法,我现在就写它以帮助别人。

    let s = new Array(src.length);
    let sp = new Array(spr.length);
    let tg = new Array(tgt.length);

    for(let i=0; i < s.length; i++)
    
        s[i] = src[i]; //src is the global variable array used as argument for Hanoi function
    

    for(let i=0; i < sp.length; i++)
    
        sp[i] = spr[i];
    

    for(let i=0; i < tg.length; i++)
    
        tg[i] = tgt[i];
    

    obj = new steps(s, sp, tg);

因此,我们不只是将数组 source、spare 和 target 直接分配到对象中,而是创建其他数组并克隆每个元素(使用 for 循环),然后使用这些数组来构造我们的对象,如代码所示结果的问题只是 [8, 7, 6...,1] 或所有步骤和所有塔中的空数组。通过这种解决方法,我们将获得预期的结果(表示塔的实际状态的数组,例如 src[1, 2]、spr[4,6,7] 等...)。

注意,在使用断点进行调试时,问题中的代码会显示出很好的结果,这使得它变得更加奇怪的错误,这对我来说可能会成为一个谜!

【讨论】:

以上是关于JavaScript中的可变长度数组数组的主要内容,如果未能解决你的问题,请参考以下文章

我如何在Javascript中拥有可变长度数组的前3个元素[重复]

Java实现长度可变数组

java 可变长度参数

创建具有未指定可变行长度的多维数组(Java)

iOS 中 关于 NSUserDefault中存储可变数组的问题

Scala数组操作