Ruby循环跳转到上一个项目

时间:2013-11-02 14:43:25

标签: ruby loops

当我循环遍历数组时

@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中是否还有其他循环可以轻松实现这种行为?

2 个答案:

答案 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