【问题标题】:Javascript recursion doesn't know when to quitJavascript递归不知道何时退出
【发布时间】:2015-03-10 14:10:21
【问题描述】:

我有这个 json 对象https://gist.github.com/motleydev/f49c779b3ed8c6522df9,我正在用 lodash 进行转换。我正在尝试通过使用一些递归来循环遍历母/父条目,直到没有更多有效条目来构建单个项目的谱系。

这是我正在使用的功能:

function getLineage(id) {
        var data = horses[id];

        if (!data){
            return; 
        } 
        else
        {
            return {
                name: data.name,
                father: getLineage(data.father),
                mother: getLineage(data.mother)
            };

        }
    };

它适用于一两代,但现在使用这个更大的数据集,我要么 A:如果我在 x 次循环后没有放入终止开关,则会收到超出调用堆栈的警告,或者 B:限制到位不会遍历所有数据,即使是已确认母亲、父亲条目的数据。我也只使用其中 15 个条目作为递归的起点。让我知道是否有什么可以帮助您更清楚地了解这个问题。

谢谢。

【问题讨论】:

  • 什么“id”值是起点?
  • 您的数据中是否有可能存在循环,其中一匹马指向父亲/母亲等,最终回到原来的马?
  • if(data.father==id || data.mother==id) return; 为每一匹马修复它
  • 例如:记录 331314307773 与它的母亲具有完全相同的 id。
  • @Pointy:GIGO。最奇怪的是她的名字是 DARIETTA 而不是 EVE...

标签: javascript json recursion lodash


【解决方案1】:

试试这个非递归版本:

var stack = []
var visited = {}
var ids = []
function getLineage(id) {
    stack.push(id)
    traverse()
    create_result(id)
}
function traverse() {
    while(stack.length > 0) {
        var id = stack.pop()
        var data = horses[i]
        if(data) {
            visited[id] = data
            ids.push[id]
            stack.push(data.father)
            stack.push(data.mother)
        }
    }
}
function create_result(id) {
    for(var i=ids.length-1;i>=0;i--) {
        var x = visited[ids[i]]
        var y = {name:x.name,father:visited[x.father],mother:visited[x.mother]}
        visited[ids[i]] = y
    }
    return visited[id]
};

【讨论】:

  • 您可以将当前分支保存在另一个堆栈变量中并检查循环
猜你喜欢
  • 1970-01-01
  • 2012-01-17
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 2020-04-28
  • 2016-10-23
相关资源
最近更新 更多