0

配列をループしているとき

@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?このようにして、現在のアイテムは falseになるまでもう一度ループされます。

たとえば、現在の x が配列のインデックス 5 にあり、!array_valid?true であるとします。したがって、ループはインデックス 4 に戻り、そこで値をインクリメントします。falseであり!array_valid?、次のインデックスは 5 で!array_valid?あり、false であり、次のインデックスは配列の最後まで 6, ... です。

または、この動作を簡単に許可する Ruby の他のループはありますか?

4

2 に答える 2

1

配列のインデックスを使用して、これを実行できるはずです。

i = 0
while ( x = @arr[i] ) do
  x.increment
  if array_valid?
    i += 1 
  else
    i -= 1
  end
end

構造を繰り返し処理するための複雑なルールがある場合、インデックス操作にフォールバックする方が簡単な場合があります。それを抽象化する賢い Ruby 風の方法が常にあるとは限りません。この場合、ループ内で反復子を操作する方法があるかもしれません.eachが、除外するためにチェックしていません。

于 2013-11-02T15:03:42.937 に答える
0

参考にさせていただいた「Simple [Sudoko] Solving Algorithm」を見てみました。注意深く聞くと、「Use recursion! Use recursion!」という囁き声が聞こえるでしょう。次のようなことを試してみるか (一部は疑似コードです)、将来同様の問題に直面したときに再帰の使用を検討してください。

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          
于 2013-11-02T17:32:05.473 に答える