2012-02-29 22 views
12

Trong more ruby way of doing project euler #2, một phần của mã làDo something vô hạn nhiều lần với một chỉ số

while((v = fib(i)) < 4_000_000) 
    s+=v if v%2==0 
    i+=1 
end 

Có cách nào để thay đổi i += 1 thành một phong cách lập trình thêm chức năng xây dựng?

Điều tốt nhất tôi có thể nghĩ đến là

Float::MAX.to_i.times do |i| 
    v = fib(i) 
    break unless v < 4_000_000 
    s += v if v%2==0 
end 

bởi vì bạn không thể gọi .times vào một số dấu chấm động.

+0

gì 'Float' phải làm gì với nó ở nơi đầu tiên? Đó là tất cả các số nguyên. –

+1

http://stackoverflow.com/questions/6373343/math-infinity-in-ruby-how-do-i-iterate-over-an-infinite-sequence –

+0

@DanielFischer: Vì tôi không thể tìm thấy số nguyên tương đương FLOAT :: MAX. –

Trả lời

12

Numeric.step có thông số mặc định là vô hạn (giới hạn) và 1 (kích thước bước).

1.step do |i| 
    #... 
end 

Đối với niềm vui, thậm chí bạn có thể muốn thử

1.step.size 
+0

FWIW ở trên dường như hoạt động đối với Ruby 2.1 và 2.2 trở lên (tôi không thử 2.0) Tương đương Ruby 1.9.3 là 1.step (Float :: INFINITY, 1) {| i | ...} – Gayle

10

Có một được xác định trước (trong 1.9.2) liên tục Float::INFINITY, vì vậy bạn có thể viết

1.upto(Float::INFINITY) do |i| 
    ... 
end 

(Bạn cũng có thể sử dụng Enumeratortake_while, biến vấn đề từ trong ra ngoài để làm cho nó trông giống như Haskell hoặc Python , nhưng take_while tham lam và xây dựng một mảng.)

Các vấn đề liên quan