JavaScript中可变长度数组的数组

JavaScript中可变长度数组的数组,javascript,arrays,towers-of-hanoi,arrayofarrays,Javascript,Arrays,Towers Of Hanoi,Arrayofarrays,我正在建立一个小网页来解决著名的河内塔问题。一切都很好,但是当尝试在每一步存储三个塔的状态(255步,8个磁盘)时,我尝试使用数组数组或对象数组,其中包含表示每个塔中磁盘的3个数组,但仅存储有8个磁盘(数组项)的状态,否则只有空数组!我的代码如下: class steps //object that store state of towers at each step { constructor(src, spr, tgt) { this.src = src;

我正在建立一个小网页来解决著名的河内塔问题。一切都很好,但是当尝试在每一步存储三个塔的状态(255步,8个磁盘)时,我尝试使用数组数组或对象数组,其中包含表示每个塔中磁盘的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);
class steps//object存储每个步骤中塔的状态
{
建造商(src、spr、tgt)
{
this.src=src;
这个.spr=spr;
this.tgt=tgt;
}
}
河内功能(n、源、目标、备用)
{
如果(n>0){
河内(n-1,来源,备用,目标);
target.push(source.pop());
document.getElementById('output')。innerHTML+=source+“;“+spare+”;“+target+”
;//打印数据以查看发生了什么 var obj=新步骤(源、备用、目标); 控制台日志(源、备用、目标); src_steps.push(obj);//src_steps是全局变量 河内(n-1,备用,目标,来源); } } src=[8,7,6,5,4,3,2,1]; spr=[]; tgt=[]; 河内(8,src,spr,tgt);

问题是,打印的数组按其应有的方式包含数据,但是对象数组只包含包含8项的数组或空数组,而不包含少于8项的数组!这里发生了什么?

我不知道问题的根源是什么,但它似乎与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);
设s=新数组(src.length);
设sp=新数组(spr.length);
设tg=新数组(tgt.length);
for(设i=0;i
因此,我们不只是直接将数组源、备用和目标分配到对象中,而是创建其他数组,克隆每个元素(使用for循环),然后使用这些数组来构造我们的对象,在问题中显示的代码中,结果只是[8,7,6…,1],或者在所有步骤和所有塔中都是空数组。通过此解决方案,我们将获得预期结果(表示塔的实际状态的数组,如src[1,2]、spr[4,6,7]等)


注意在使用断点进行调试时,问题中的代码显示了良好的结果,这使得它更奇怪,这可能对我来说是个谜

在函数开始时的递归调用没有任何意义。我不知道您是否使用es6+,但模板字符串会使
文档
行更容易理解。我编辑了问题,希望现在问题清楚了@我的问题不是关于解决方案的逻辑,而是工作正常,递归函数可以得到所需的解决方案