加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

更多ruby方式做项目euler#2

发布时间:2020-12-17 03:51:36 所属栏目:百科 来源:网络整理
导读:我正在尝试学习 Ruby,并且正在解决一些Project Euler问题.我这样解决了 problem number two: def fib(n) return n if n 2 vals = [0,1] n.times do vals.push(vals[-1]+vals[-2]) end return vals.lastendi = 1s = 0while((v = fib(i)) 4_000_000) s+=v if
我正在尝试学习 Ruby,并且正在解决一些Project Euler问题.我这样解决了 problem number two:

def fib(n)
  return n if n < 2
  vals = [0,1]
  n.times do
    vals.push(vals[-1]+vals[-2])
  end
  return vals.last
end
i = 1
s = 0
while((v = fib(i)) < 4_000_000)
  s+=v if v%2==0
  i+=1
end
puts s

虽然这有效,但它似乎不是非常ruby-ish-我无法想出任何好的纯Ruby回答,就像我可以用第一个(puts(0..999).inject {| sum,n | n%3 == 0 || n%5 == 0?sum:sum n}).

解决方法

为了一个很好的解决方案,为什么不创建一个Fibonacci数字生成器,如Prime或Triangular示例I gave here.

从这里,你可以使用漂亮的Enumerable方法来处理这个问题.你可能想知道甚至斐波那契数字是否有任何模式.

编辑您的问题以发布您的解决方案……

注意:有比列举它们更有效的方法,但是它们需要更多的数学运算,不会像这样清楚,只有在4百万更高的情况下才会发光.

正如demas’发布了一个解决方案,这里有一个清理版本:

class Fibo
  class << self
    include Enumerable

    def each
      return to_enum unless block_given?
      a = 0; b = 1
      loop do
        a,b = b,a + b
        yield a
      end
    end
  end
end

puts Fibo.take_while { |i| i < 4000000 }.
          select(&:even?).
          inject(:+)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读