当我循环遍历数组时
@arr.each {|x|
x.increment #x is an instance of my class that implements the increment method
if !array_valid? #array_valid? is my method with specific logic
#make 'x' previous item in array and continue
end
}
是否可以返回上一个项目而不是继续以下项目?这样,当前项目将再次循环,直到!array_valid?
为假。
例如,假设当前x位于数组中的索引5处,!array_valid?
为真,因此循环返回索引4,在那里递增一个值,!array_valid?
为false ,下一个索引是5,!array_valid?
为假,下一个索引是6,...,直到数组结束。
或者Ruby中是否还有其他循环可以轻松实现这种行为?
答案 0 :(得分:1)
您应该可以使用数组索引来执行此操作:
i = 0
while ( x = @arr[i] ) do
x.increment
if array_valid?
i += 1
else
i -= 1
end
end
如果你有一个复杂的规则来迭代结构,有时回退到索引操作会更简单,并不总是有一种聪明的Ruby-ish方法来抽象它。虽然在这种情况下可能是一种在.each
循环中操作迭代器的方法,但我没有检查过它。
答案 1 :(得分:0)
我查看了您引用的"Simple [Sudoko] Solving Algorithm"。仔细听,你会听到它低语,“使用递归!使用reusion!”。你可能想尝试这样的事情(有些是伪代码)或考虑在将来遇到类似问题时使用递归:
def solve_it
initial_state = < [], {}, nil or ? >
outcome, solution = solve_next([0,0], initial_state)
if outcome == :solved
puts "I solved it! I solved it!"
puts "Here's my solution!"
<print solution>
else
puts "No solution exists"
end
end
def solve_next(current_cell, state)
(1..9).each do |v|
if current_cell -> v is valid
new_state = state + current_cell -> v
(return :solved, new_state) if current_cell == last_cell ([nrows-1, ncols-1])
i, j = current_cell
new_current_cell = (j < ncols-1) ? [i,j+1] : [i+1, 0]
outcome, solution = solve_next(new_current_cell, new_state)
if outcome == :solved
updated_solution = solution + current_cell -> v
return :solved, updated_solution
end
end
end
return :no_solution
end