2

for変数の値に応じて、自分自身にできるだけ多くのサイクルを入れたいです。
たとえば、変数が の場合、@var = 1実行する必要があるのは次のとおりです。

for letter1 in @range
  do something
end

変数の場合@var = 2:

for letter1 in @range
  for letter2 in @range
    do something
  end
end 

変数 @var = 3 の場合

for letter1 in @range
  for letter2 in @range
    for letter3 in @range
      do something
    end
  end
end 

以下のこのコードよりもスマート/少ないコードの方法はありますか? 私は自分自身をもう一度繰り返したくありません。

if @var == 1
  for letter2 in @range
    do something
  end
elsif @var == 2
  for letter1 in @range
    for letter2 in @range
      do something
    end
  end
elsif @var == 3
  for letter1 in @range
    for letter2 in @range
      for letter3 in @range
        do something
      end
    end
  end 
end

そのdo something部分は、どの場合でも常に同じです。違いは、それがどれだけのサイクルにあるかだけです。

4

2 に答える 2

3

再帰について読む必要があります: http://en.wikipedia.org/wiki/Recursion_(computer_science)
次のようなものです:

def f(depth,letters=[])
  if depth == 0
    do someting with letters
  else
    for letter in @range
      f(depth-1,letters+[letter])
    end
  end
end

f(@var)

f再帰的に自分自身を呼び出す文字を通過する関数です。各呼び出しには infodepthがあります。これは、再帰の深さを意味します。

于 2011-01-25T11:46:14.703 に答える
1
@range.map{|x| x}.product(*([@range.map{|x| x}] * n)) do |*args|
  do_something_with(*args)
end
于 2011-01-26T22:40:46.993 に答える