2016-04-28 11 views
0
def breadth_first_search(adj_matrix, source_index, end_index) 
    node_queue = [source_index] 
    puts "#{source_index} stored into queue \n" 

    loop do 
    curr_node = node_queue.pop 
    puts "#{curr_node} popped \n" 
    return false if curr_node == nil 
    return true if curr_node == end_index 

    children = (0..adj_matrix.length-1).to_a.select do |i| 
     adj_matrix[curr_node][i] == 1 

    end 

    puts "children: #{children}" 
    node_queue = children + node_queue 
    puts "node_queue: #{node_queue}" 
    end 
end 

Ich kann verstehen, was es konzeptionell tut, aber die tatsächliche Syntax ist, was ich nicht verstehe. Ist die Child-Variable ein Array, das Elemente mit einer Schleife speichert?Was bedeutet dieser Codeschnipsel im Child-Variablenfeld?

Antwort

2

Die Variable children wird oft select

select auf das Ergebnis des Verfahrens enumerable eingestellt wird, ist ein Verfahren auf einem Array genannt, die einen Block erfolgt. Der Rückgabewert ist nur die Werte der ursprünglichen Anordnung, bei der der Block liefert ein truthy Objekt (zB nicht false, nicht nil)

(0..adj_matrix.length-1) ist ein Kreisobjekt, von 0 bis zur Länge von adj_matrix, was zu einem überführt wird Array über to_a (resultierend in [0, 1, 2, ...])

dann ist das Array von select um nur die Werte in der adj_matrix[curr_node][i] == 1 gefiltert werden. Also, wenn die Knoten bei Index 0 und 2, gleich sind 1

dann wäre das Ergebnis [0, 2]