试图用字典找到最短的路线?

时间:2018-01-23 14:24:41

标签: javascript arrays recursion

我目前正致力于创建一个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];
}

我的问题是,当我尝试创建所有可能路线的aSt数组时,我得到的答案不正确。

findPath的正确答案(&#34; Isri&#34;,#34; Harith&#34;)应该是[&#39; Isri&#39;,&#39; Eully&#39;,&# 39;哈里斯&#39]。但是,我得到了[&#34; Isri&#34;,&#34; Valera&#34;,&#34; Lisim&#34;,&#34; Eully&#34;]。我错过了什么?这里出了什么问题?

1 个答案:

答案 0 :(得分:1)

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