2011-01-25 8 views
2

変数内の値に応じて多くのサイクルをfor個入れたいと思います。例えば
は、変数@var = 1場合、私は実行する必要があります。変数に応じて多くのネストされた `for`サイクルがあります

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部分は常に、それぞれの場合に同じです。違いはそれがであるだけでどのくらいのサイクルである

+0

「O(n²)」という警告音が鳴ります。 – Dykam

答えて

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することは、再帰的に自身を再度呼び出す手紙を経由する関数です。各コールには、depthという情報があります。これは、さらに深い再帰がどれほど深刻なものであるべきかを意味します。

+0

私は理論的に再帰が何であるかを知っていますが、私はそのコードの何かの部分でそのサイクル変数(上記のコードからletter1、letter2、letter3など)を使う必要があります。このソリューションでは、そうする方法がありますか?このスクリプトは@varの長さと@rangeの文字を使用して、可能なすべての文字列の組み合わせを導き出しています。答えをありがとう。 – Kreeki

+0

@Kreeki、 'letters'は文字を含む配列です - それぞれは' + [letter] 'で配列に追加されました。それは新しいより長い配列を作り、再帰的に呼ばれる関数にそれを送ります。 – Nakilon

1
@range.map{|x| x}.product(*([@range.map{|x| x}] * n)) do |*args| 
    do_something_with(*args) 
end 
関連する問題