2015-02-23 77 views
0

我编写了一个小代码来加载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文件。

+1

问题代码在哪里?你显示函数'loadNetworkNonROld()',但它永远不会被使用。还提到'stack-que',但是那是什么?总体问题并不清楚。这是不是一个好主意,用'异步:FALSE' – charlietfl 2015-02-23 16:21:51

+0

它在使用$( '#formdepth')上( '提交',函数(事件){ event.preventDefault(); 深度= $(”。 #深度')。VAL(); // loadNetwork(user,depth,'login'); networkAllUsers = loadNetworkNonROld(user,depth,'login') }); – marcinwal 2015-02-23 18:53:47

+1

你能否告诉你为什么你想使用非递归函数,当你已经有一个递归的函数时,你会想要什么? – Tomalak 2015-02-25 09:33:49

回答

0

看起来好像这个问题很可能是迭代版本中loadFollowers的异步运行。

但是你的问题的关键问题是,当你向我们展示的代码,你不告诉我们您所遇到的错误,你不说什么“堆栈阙”是或回应评论请求为了澄清。

此外,您不会告诉我们如何运行代码来复制遇到的问题。查看你的代码中,我采取了一系列猜测,你可以看到一些结果在这个屏幕截图:

screen shot of trying to replicate the error

,我来适当地缩进您的迭代的代码,并添加了一些记录产生的上述部分输出:

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的异步性质意味着之前的任何完成了网络调用的返回结果 - 因此访问结果只有有史以来第一个用户。

+0

欢迎您 - 如果答案正确,请点击正确 – 2015-06-15 17:17:14