Javascript 用字典查找最短路径?

Javascript 用字典查找最短路径?,javascript,arrays,recursion,Javascript,Arrays,Recursion,我目前正在创建一个findPath()函数。希望下面的代码能澄清所有问题。我在用Javascript工作。基本上,findPath()函数从堆栈获取参数,也可以选择从堆栈获取参数。我已经能够使我的功能工作,但我希望它得到最短的路径可能。这是我目前的代码: function findPath(from, to, stack){ if(!stack) stack = [from]; var opts = getTravelOptions(from); var aSt = []

我目前正在创建一个findPath()函数。希望下面的代码能澄清所有问题。我在用Javascript工作。基本上,findPath()函数从堆栈获取参数,也可以选择从堆栈获取参数。我已经能够使我的功能工作,但我希望它得到最短的路径可能。这是我目前的代码:

function findPath(from, to, stack){
    if(!stack) stack = [from];
    var opts = getTravelOptions(from);
    var aSt = [];
    for(var i = 0; i < opts.length; ++i){
        if(stack.indexOf(opts[i]) >= 0) continue; //No Circles
        stack.push(opts[i]);
        if(to == opts[i]){
            return stack; //Shortest possible
        }else{
            var news = findPath(opts[i],to,stack);
            if(news.length > 0){
                aSt.push(news);
                //return news;
            }
        }
        stack.pop();
    }


    var shortest = [];
    for(var i2 = 0; i2 < aSt.length; i2++){
        if(shortest.length == 0) shortest = aSt[i2];
        if(shortest.length > aSt[i2].length) shortest = aSt[i2];
    }
    return shortest;
}
function getTravelOptions(from){
    var map = {
        'Sanfew': ['Lisim','Rynir Mines'],
        'Lisim': ['Sanfew','Rynir Mines','Valera'],
        'Valera': ['Endarx','Isri', 'Lisim'],
        'Endarx': ['Rile','Valera'],
        'Rile': ['Endarx'],
        'Isri': ['Valera','Eully'],
        'Eully': ['Isri','Harith'],
        'Harith': ['Eully', 'Port Senyn'],
        'Port Senyn': ['Harith'],
        'Rynir Mines': ['Sanfew','Lisim','Harith']
    };
    if(!from) return Object.keys(map);
    return map[from];
}
函数findPath(从、到、堆栈){
如果(!stack)stack=[from];
var opts=GetTravelopions(来自);
var-aSt=[];
对于(变量i=0;i=0)继续;//没有圆
堆栈推送(opts[i]);
if(to==opts[i]){
返回堆栈;//尽可能短
}否则{
var news=findPath(opts[i],to,stack);
如果(news.length>0){
广播推送(新闻);;
//返回消息;
}
}
stack.pop();
}
var=[];
对于(var i2=0;i2aSt[i2].length)shortest=aSt[i2];
}
返回时间最短;
}
函数getTravelOptions(来自){
变量映射={
“Sannow”:[“Lisim”,“Rynir Mines”],
‘Lisim’:[‘Sannow’、‘Rynir Mines’、‘Valera’],
'瓦莱拉':['Endarx','Isri','Lisim'],
'Endarx':['Rile','Valera'],
'Rile':['Endarx'],
“Isri”:[瓦莱拉”,“尤利],
“Eully”:[“Isri”,“Harith”],
“哈里斯”:[“尤利”,“塞尼恩港],
“塞尼恩港”:[“哈里斯”],
“Rynir矿山”:[“Sannow”、“Lisim”、“Harith”]
};
如果(!from)返回Object.keys(映射);
返回地图[从];
}
我的问题是,当我试图创建所有可能路由的aSt数组时,我得到了错误的答案


findPath(“Isri”、“Harith”)的正确答案应该是['Isri'、'Eully'、'Harith']。然而,我得到了[“Isri”、“Valera”、“Lisim”、“Eully”]。我错过了什么?这里出了什么问题?

问题是Javascript通过引用而不是通过值传递数组。只需将递归调用更改为使用stack.slice(0)而不是stack,即可创建数组的“影子”副本。

具体地说,这个var news=findPath(opts[i],to,stack.slice(0));