我编写了一个小代码来加载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文件。
问题代码在哪里?你显示函数'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