Множество вложенных циклов for в зависимости от переменной - PullRequest
2 голосов
/ 25 января 2011

Я хочу поместить в себя столько 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 всегда одинакова в каждом случае. Разница лишь в том, сколько циклов в нем.

Ответы [ 2 ]

3 голосов
/ 25 января 2011

Вы должны прочитать о рекурсии: 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, что означает, насколько глубокой должна быть рекурсия.

1 голос
/ 27 января 2011
@range.map{|x| x}.product(*([@range.map{|x| x}] * n)) do |*args|
  do_something_with(*args)
end
...