Сброс цикла или возврат к началу цикла в Ruby?(Нахождение числовых факторов) - PullRequest
1 голос
/ 27 августа 2010

Я пытаюсь найти факторы числа N. Я хочу иметь возможность выполнять итерацию по моему массиву простых чисел, и, когда условие выполнено, вернуться к началу итерации, а не просто продолжать.

arrFactors = []    
N = 150
[2,3,5,7,11].each do |a|
  if N % a == 0
    arrFactors.push(a)
    N = N/a
    break if N == 1
    <return to start of the collection [2,3,5,7,11]>
  end
end

Как я могу сделать это в Ruby 1.8.6? (Я заметил, что в 1.8.7 есть счетчик циклов, который может быть относительным?)

P.S
Я знаю, что приведенный ниже алгоритм еще не идеален (я думаю, что мне нужно предусмотреть N = 1). Я также знаю, что Ruby предоставляет метод факторинга, но я не хочу его использовать, потому что я учусь здесь.

Ответы [ 4 ]

2 голосов
/ 27 августа 2010

Вместо того, чтобы использовать метод Array.each, вы можете изучить метод Array.select. Этот метод принимает блок и возвращает новый массив только с элементами, которые соответствуют вашей логике. Если ваш блок возвращает true, то этот элемент будет включен в набор результатов. Следующий код использует метод select и выполняет то, что вы ищете:

[2,3,5,7,11].select do |a|
  if N % a == 0
    N = N/a
    break if N == 1
    return true
  end
  return false
end

Документацию по методу select можно найти здесь .

2 голосов
/ 27 августа 2010

вы можете использовать что-то подобное:

[2,3,5,7,11].each do |a|

  while N % a == 0
    arrFactors.push(a)
    N = N/a
  end

  if N == 1 then
    break
  end

end

Это избавит от необходимости сбрасывать внешний цикл.

1 голос
/ 27 августа 2010

«redo» сбрасывает текущую итерацию цикла loop . «Повторить» будет начинать цикл заново. (О, и "N" является константой; должно быть "n".)

0 голосов
/ 27 августа 2010

Вы можете попробовать это

n = 150
factors = [2,3,5,7,11]
arrFactors = []
factor_index = 0
  while ((factors.size > factor_index + 1) || n > 1) do
    factors.each_with_index { |f, i|      
      factor_index = i
      if (n % f) == 0
        arrFactors.push(f)
        n = n / f 
        break
      end
    }
  end
puts n
puts arrFactors
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...