对于提出如此狭隘的问题抱歉。我试图解决Project Euler中的问题5(计算可以被1到20的所有数字整除的最小正数)来学习Ruby。
我写了以下代码:
def calc_min_multiple(array)
array.each do |value|
if div_check(value) == true
return value
break
end
end
end
def div_check(num)
1.upto(20) do |divisor|
if num % divisor != 0
return false
end
end
return true
end
range = *(20..500000)
puts calc_min_multiple(range)
奇怪的是程序只是将每个值放在我定义的范围数组中,而不通过函数内部的所有逻辑。我试过调试但找不到问题。非常感谢任何帮助!
答案 0 :(得分:1)
问题的答案“为什么我的方法会返回并返回我给它的数组?”是由于文档中有关each
when you give a block.的内容。返回该数组。
答案 1 :(得分:0)
calc_min_mulitple
方法
div_check(value) == true
。虽然它可以工作,但你不会像这样检查布尔相等。只需if div_check(value)
true
或if !div_check(value)
false
。
在array.each
阻止break
语句无法访问,因为您之前是return false
。
答案 2 :(得分:-1)
您遇到的问题是因为您的代码没有尝试足够高的数字来满足标准。 (提示:它超过1E8,并且 age 以这种方式计算,这就是为什么它在Project Euler上!)
当calc_min_multiple
中的循环终止于数组的末尾时,它返回最后一个被评估的表达式each
,它计算出它所作用的数组,所以你的{{1只打印数组元素的所有。
因此,您需要puts
方法中的特定return
来表示未找到任何结果。
另一点。 Ruby calc_min_multiple
也没有构建一个50万个元素数组,而是有一个range
方法,所以你可以通过(unflattened)范围。
你也可以在这里有用地使用修复后的语句修饰符each
,所以你的方法看起来像这样
if
<强>输出强>
def calc_min_multiple(range)
range.each do |value|
return value if div_check(value)
end
'None'
end
def div_check(num)
1.upto(20) do |divisor|
return false if num % divisor != 0
end
return true
end
puts calc_min_multiple(20..500_000)
最后,采用更加Rubyish的方式:
None