首先,对于那些不知道(或忘记)Lychrel数字的人,这里有一个来自Wikipedia的条目:http://en.wikipedia.org/wiki/Lychrel_number
我想实现从0到10μ000范围内的lychrel数检测器。以下是我的解决方案:

class Integer

  # Return a reversed integer number, e.g.:
  #
  #   1632.reverse #=> 2361
  #
  def reverse
    self.to_s.reverse.to_i
  end

  # Check, whether given number
  # is the Lychrel number or not.
  #
  def lychrel?(depth=30)
    if depth == 0
      return true
    elsif self == self.reverse and depth != 30 # [1]
      return false
    end
    # In case both statements are false, try
    # recursive "reverse and add" again.
    (self + self.reverse).lychrel?(depth-1)
  end
end

puts (0..10000).find_all(&:lychrel?)

此代码的问题在于深度值[1]所以,基本上,深度是一个值,它定义了我们需要在迭代过程中进行多少次,可以肯定的是,当前的数字实际上是一个Lychrel数默认值是30次迭代,但我想添加更多的纬度,这样程序员可以通过方法的参数指定自己的深度30次迭代非常适合我需要的小范围,但是如果我想覆盖所有自然数,我必须更加灵活。
因为递归,它在整数lychrel中有一个位置?,我不能敏捷。如果我为lychrel?提供了一个参数,就不会因为[1]语句而有任何更改。
所以,我的问题是这样的:“我如何重构我的方法,以便它能正确地接受参数?”.

最佳答案

更干净、更像红宝石的解决方案:

class Integer

  def reverse
    self.to_s.reverse.to_i
  end

  def lychrel?(depth=50)
    n = self
    depth.times do |i|
      r = n.reverse
      return false if i > 0 and n == r
      n += r
    end
    true
  end

end

puts (0...10000).find_all(&:lychrel?) #=> 249 numbers

关于ruby - 吕克雷尔数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6784163/

10-12 20:42