我正在建立小网页来解决着名的河内塔问题。一切都很好,但是当试图在每一步存储三个塔的状态时(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个项目的数组!这里发生了什么?
答案 0 :(得分:0)
我无法确定问题的根源,但它似乎与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] 等...)。
注意,在使用断点进行调试时,问题中的代码显示效果很好,这使得它更加奇怪,这对我来说可能会是一个谜!