【发布时间】:2016-03-22 14:31:22
【问题描述】:
我有这个代码:
def test(vertices, distances)
until vertices.empty?
nearest_vertex = vertices.inject do |a, b|
p "a = #{a}: b = #{b}"
p "distances[a] = #{distances[a]}, distances[b] = #{distances[b]}"
next b unless distances[a] #next b if distances[a] == true
next a unless distances[b] #next a if distances[b] == true
next a if distances[a] < distances[b]
p "b = #{b}"
b
end
p "nearest_vertex = #{nearest_vertex}"
vertices.delete nearest_vertex
end
end
vertices = [1, 2, 3, 4, 5, 6]
distances = {1 => 0, 2 => 3, 3 => 2, 4 => 18, 5 => nil, 6 => 7}
test(vertices, distances)
哪些输出:
"a = 1: b = 2"
"distances[a] = 0, distances[b] = 3"
"a = 1: b = 3"
"distances[a] = 0, distances[b] = 2"
...
"a = 1: b = 6"
"distances[a] = 0, distances[b] = 7"
"nearest_vertex = 1"
这里没有打印b = 6。这是因为next 发出了停止迭代命令吗?
"a = 2: b = 3"
"distances[a] = 3, distances[b] = 2"
"b = 3"
这里为什么不继续迭代@987654326@?
"a = 3: b = 4"
"distances[a] = 2, distances[b] = 18"
"a = 3: b = 5"
"distances[a] = 2, distances[b] = "
"a = 3: b = 6"
"distances[a] = 2, distances[b] = 7"
"nearest_vertex = 3"
...
一旦将a 设置为3,一切都会按照我的想法进行。程序怎么知道nearest_vertex是三?
我不明白inject 和next 在确定如何以及何时将顶点声明为nearest_vertex 之间的交互。没有比较运算符时,距离是如何比较的?
【问题讨论】:
-
我相信您将块中的累加器和元素混合到
inject上。根据您的 cmets,您希望它是|element, accum|,而恰恰相反:|accum, element|。尝试将|a, b|交换为|b, a|。 -
“最接近”什么?
-
感谢铁皮人编辑我的原帖。这是我在 StackOverflow 上发布的第一个问题,原始格式不太理想。 Nearest 只是将“a”与所有其他“b”进行比较并选择最小的数字。这是从 Ruby 中 Dijkstra 算法的实现中脱离上下文的一小段代码。