рекурсия в алгоритме исследования графов JavaScript - PullRequest
1 голос
/ 08 февраля 2011

Я пытаюсь исследовать график здесь, но я не уверен, что не так с функцией исследования.Кажется, что рекурсия работает неправильно;исследуя соседей узла 0, он исследовал 0, 1, 2 и затем никогда не возвращается, чтобы исследовать 3, 4, 5;почему это так?

explored=[]
//class definition 
function graph(){
    this.graph=new Array();
    this .graph[0] = [1,0,1,1,0,1]
    this .graph[1] = [0,1,1,1,0,0]
    this .graph[2] = [1,1,1,1,0,0]
    this .graph[3] = [1,1,1,1,1,0]
    this .graph[4] = [0,0,0,1,1,0]
    this .graph[5] = [1,0,0,0,0,0]

    this.explore    = explore

}

function explore(node,depth){

    explored[node]=1
    document.write('<br>')
    for(x=0;x<depth;x++)
        document.write('-')
    document.write(node+'<br>')
    neighbours=this.graph[node]

    document.write('exploring '+node +' neighbours' + neighbours +'explored = '+explored)

    for ( i=0;i<neighbours.length;i++){
        document.write('checking'+i+' node is ='+node )
        if(neighbours[i] ==1 && explored[i]!=1)
            this.explore(i,++depth)
    }

}

g = new graph()
g.explore(0,0)  

Ответы [ 2 ]

4 голосов
/ 08 февраля 2011

, опуская var, вы устанавливаете глобальные переменные в рекурсивной функции и наступаете на ноги, вот исправленный код

function explore(node,depth){

    explored[node]=1
    document.write('<br>')
    for(**var** x=0;x<depth;x++)
        document.write('-')
    document.write(node+'<br>')
    **var** neighbours=this.graph[node]

    document.write('exploring '+node +' neighbours' + neighbours +'explored = '+explored)

    for (**var** i=0;i<neighbours.length;i++){
        document.write('checking'+i+' node is ='+node )
        if(neighbours[i] ==1 && explored[i]!=1)
            this.explore(i,++depth)
    }

}
2 голосов
/ 08 февраля 2011

Линия this.explore(i,++depth) также может вызывать у вас проблемы, так как вы увеличивают глубину в текущей области, а также передают увеличенную значение для рекурсивного вызова,

лучше использовать

this.explore(i, depth + 1);

Если вы сомневаетесь в javascript, всегда полезно проверить код с помощью jslint.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...