【问题标题】:Reset loop, or return to start of loop, in Ruby? (Finding a number's factors)在Ruby中重置循环或返回循环开始? (找到一个数的因数)
【发布时间】:2011-04-04 16:32:15
【问题描述】:

我正在尝试找到数字 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 中有一个“循环”枚举器可能是相关的?)

附言
我知道下面的算法还不完美(我想我需要提供 N = 1)。我也知道 Ruby 提供了一种分解方法,但我不想使用,因为我在这里学习。

【问题讨论】:

    标签: ruby loops


    【解决方案1】:

    你可以使用类似的东西:

    [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
    

    这将消除重置外循环的需要。

    【讨论】:

    • 这解决了我的问题,但它是否回答了我重置循环的主要问题?它之所以起作用,只是因为在除法时,这些因素似乎不会跳来跳去。换句话说,因子不会按 2、5、2、7 的顺序出现(140/2 = 70/2 = 35/5 = 7)。但是,如果我想在其他一些假设问题中重置循环,是否有 Ruby 枚举器或其他可以做到这一点?
    • 我不是 100% 确定,但我认为这在每个循环中是不可能的。您可以通过在 while 循环中根据需要定义一个 array_index 来实现对数组的更直接控制。老派,是的,但给你更直接的控制。
    【解决方案2】:

    您可以考虑使用Array.select 方法,而不是使用Array.each 方法。此方法需要一个块,并将返回一个新数组,其中仅包含与您的逻辑匹配的项目。如果您的块返回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 方法的文档可以在here 找到。

    【讨论】:

      【解决方案3】:

      "redo" 重置循环的当前迭代 loop。 “重试”将重新开始循环。 (哦,“N”是一个常数;应该是“n”。)

      【讨论】:

      • 不,它没有。它重置循环的当前迭代
      【解决方案4】:

      你可以试试这个

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-15
        • 2018-08-22
        • 2021-06-22
        • 1970-01-01
        • 2022-08-14
        • 2018-03-06
        • 1970-01-01
        相关资源
        最近更新 更多