在Ruby中迭代无限序列
我正在尝试解决Euler项目问题#12:
三角形数字的序列是通过将自然
数字。所以第7个三角数
将是1 + 2 + 3 + 4 + 5 + 6 + 7 =
28.前十个术语是:
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
让我们列出前七个三角形数字的因数:
1: 1
3: 1,3
6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28
我们可以看到28是第一个超过5的三角形
除数。
超过五个的第一个三角形的值是多少
一百个除数?
这是我使用Ruby提出的解决方案:
triangle_number = 1
(2..9_999_999_999_999_999).each do |i|
triangle_number += i
num_divisors = 2 # 1 and the number divide the number always so we don\'t iterate over the entire sequence
(2..( i/2 + 1 )).each do |j|
num_divisors += 1 if i % j == 0
end
if num_divisors == 500 then
puts i
break
end
end
我不应该使用像9_999_999_999_999_999这样的任意大数字。如果我们像某些函数语言一样具有Math.INFINITY序列,那会更好。如何在Ruby中生成惰性无限序列?
没有找到相关结果
已邀请:
10 个回复
茂坦湿床够
要么:
编程Ruby 1.9(又名\“ Pickaxe Book \”),第3版。 ed。,p。图83有一个三角数枚举器的例子。修改上面的枚举器以生成三角数应该很容易。我会在这里进行操作,但这将逐字重现示例,可能超出“合理使用”所允许的范围。
号拳藐孔妇
就你而言
您的暴力破解方法很粗糙,可能需要很长时间才能完成。
死簇
嫩昧竞莫
戊袱
资料来源:https://bugs.ruby-lang.org/issues/12912
鲁釜头
艰管垮淮
真的不认为它比循环慢得多。您也可以将状态保存在类对象中,但是您将需要进行更多输入:
添加: 对于那些喜欢longjmps的人:
荆怖赡
显然,它不能解决原始的Euler问题,但对于生成无限的整数序列很有好处。绝对适用于Ruby> 2.0。请享用!
嗓瑰
或使用JonasElfström的解决方案进行更新:
希望这对某人有用!
碉罕城爸