新手问题 关于 take_while

ElmerNing · 2012年12月18日 · 最后由 ElmerNing 回复于 2012年12月18日 · 2368 次阅读

初学 ruby,在用 eulerproject 练手。其中第二题题目如下 斐波那契数列中的每一项被定义为前两项之和。从 1 和 2 开始,斐波那契数列的前十项为:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

考虑斐波那契数列中数值不超过 4 百万的项,找出这些项中值为偶数的项之和。

fib = Enumerator.new { |y|  
            a = 1; b = 2;
            loop {  
                y << a
                a, b = b, a + b 
            } 
        }

p fib.take_while { |x|
    x < 4e6 and x % 2 == 0
}.reduce(:+)     # => nil

其中 fib.take_while 获取数列 中小于 400w 的偶数,失败了,返回空数组。

可是,如下缺能正确运行

fib.take_while{|x|
    x<4e6
}     # => [1,2,3,5,....]

求解释

因为第一个数是 1,直接就是 false,所以后边的就不会再取了

原来如此 一直以为这个是把所有满足条件的 取出来,看了下 的确应该是用 select 来弄

需要 登录 后方可回复, 如果你还没有账号请 注册新账号