首先,对于那些不知道(或忘记)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/