我編寫了一個小代碼來加載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