【问题标题】:Trying to find shortest route with dictionary?试图用字典找到最短路线?
【发布时间】:2018-01-23 23:06:51
【问题描述】:

我目前正在创建一个 findPath() 函数。希望下面的代码可以解决任何问题。我正在使用 Javascript。基本上,findPath() 函数接受参数 fromto 和可选的 stack。我已经能够使我的功能正常工作,但是我希望它能够获得尽可能最短的路径。这是我当前的代码:

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("Isri","Harith") 的正确答案应该是 ['Isri','Eully','Harith']。但是,我得到了 [“Isri”、“Valera”、“Lisim”、“Eully”]。我错过了什么?这里出了什么问题?

【问题讨论】:

    标签: javascript arrays recursion


    【解决方案1】:

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

    【讨论】:

    • 特别是这个 var news = findPath(opts[i],to, stack.slice(0));
    猜你喜欢
    • 1970-01-01
    • 2021-10-20
    • 2016-06-25
    • 2014-04-14
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多