如何将递归方法更改为js中的非递归方法
我编写了一个小代码来加载GitHub中的追随者树。如何将递归方法更改为js中的非递归方法
它对我的递归版本运行良好,但我无法让我的“stack-que”版本运行。
我收到我的回应后,我完成我的循环这是问题;我的递归解决方案使用相同的loadFollowers方法,但由于它的调用结构它产生所需的树。
我应该在通话中以某种方式切换异步吗?
这只是正常function loadFollowers(user,field,callback){
path = 'https://api.github.com/users/'+user.info[field]+'/followers';
path += '?client_id=' + pass.client_id + '&client_secret='+pass.client_secret
console.log("path:"+path+' field: '+field+' node: '+user);
$.get(path,function(followers){
for(var i = 0;i < followers.length; i++){
current = new Node();
current.info = followers[i];
user.addFollower(current);
callback();
};
});
}
function loadNetworkNonROld(node,depth,field){
var toVisit = [];
var visited =[];
var deep;
var current;
var curr;
toVisit.push([node,depth]); // saves [node,level] to control how deep it is
// starts at initial node
while (toVisit.length > 0){
curr = toVisit.shift();
current = curr[0];
deep = curr[1];
if((visited.indexOf(current.info[field])===-1) && (deep > 0)){
visited.push(current.info[field]);
loadFollowers(current,field,function(){
for(var i=0;i < current.followers.length; i++){
toVisit.push([current.followers[i],deep-1]);
}
});
}
}
return visited;
}
递归版本如下:
function loadNetwork(node,depth,field){
loadFollowers(node,field,function(){
if (depth == 0){return;}
for(var i=0; i < node.followers.length; i++){
current = node.followers[i];
id = current.info[field];
if (networkAllUsers.indexOf(id)===-1)
{
networkAllUsers.push(id);
console.log(id);
loadNetwork(current,depth-1,field);
}
}});
}
GitHub的链接是:https://github.com/marcinwal/myownnode.git 和代码公共/ JavaScript的/ main.js文件。
看起来好像这个问题很可能是迭代版本中loadFollowers的异步运行。
但是你的问题的关键问题是,当你向我们展示的代码,你不告诉我们您所遇到的错误,你不说什么“堆栈阙”是或回应评论请求为了澄清。
此外,您不会告诉我们如何运行代码来复制遇到的问题。查看你的代码中,我采取了一系列猜测,你可以看到一些结果在这个屏幕截图:
,我来适当地缩进您的迭代的代码,并添加了一些记录产生的上述部分输出:
function loadNetworkNonROld(node,depth,field){
var toVisit = [];
var visited =[];
var deep;
var current;
var curr;
toVisit.push([node,depth]); // saves [node,level] to control how deep it is
// starts at initial node
while (toVisit.length > 0){
console.log(toVisit)
curr = toVisit.shift();
current = curr[0];
deep = curr[1];
if((visited.indexOf(current.info[field])===-1) && (deep > 0)){
visited.push(current.info[field]);
console.log(visited)
loadFollowers(current,field,function(){
for(var i=0;i < current.followers.length; i++){
toVisit.push([current.followers[i],deep-1]);
console.log('loadFollowers:' + toVisit)
}
});
}
}
return visited;
}
现在我可以花作出进一步努力在你的代码踢,猜测是否有一些输出,我们得到的,你有什么,但你不能因此很容易为人们提供帮助。
从我在控制台中看到日志,它看起来像你对我的推动所有的节点上深度为1和它们永远不会到达深度0,所以它只是运行上和永远。平行更改loadFollowers功能
while (toVisit.length > 0){
console.log(toVisit)
curr = toVisit.shift();
current = curr[0];
deep = curr[1];
if((visited.indexOf(current.info[field])===-1) && (deep > 0)){
visited.push(current.info[field]);
console.log('loadNetworkNonROld: '+deep);
loadFollowers(current,field,deep,function(depth){
console.log('loadFollowers:' + (depth-1));
for(var i=0;i < current.followers.length; i++){
toVisit.push([current.followers[i],(depth-1)]);
}
});
}
}
console.log('loadNetworkNonROld: visited:'+JSON.stringify(visited));
return visited;
}
这样的深度值实际上是沿着通过:而在递归版本的深度到达0
我修改您的代码如下所示。现在代码运行没有永远的迭代,但JavaScript的异步性质意味着之前的任何完成了网络调用的返回结果 - 因此访问结果只有有史以来第一个用户。
欢迎您 - 如果答案正确,请点击正确 – 2015-06-15 17:17:14
问题代码在哪里?你显示函数'loadNetworkNonROld()',但它永远不会被使用。还提到'stack-que',但是那是什么?总体问题并不清楚。这是不是一个好主意,用'异步:FALSE' – charlietfl 2015-02-23 16:21:51
它在使用$( '#formdepth')上( '提交',函数(事件){ event.preventDefault(); 深度= $(”。 #深度')。VAL(); // loadNetwork(user,depth,'login'); networkAllUsers = loadNetworkNonROld(user,depth,'login') }); – marcinwal 2015-02-23 18:53:47
你能否告诉你为什么你想使用非递归函数,当你已经有一个递归的函数时,你会想要什么? – Tomalak 2015-02-25 09:33:49