Я изучаю Rust, поэтому я занимаюсь проблемами Project Euler, так как они хорошие упражнения imho. Но я уже застрял на второй проблеме. Идея состоит в том, чтобы найти сумму всех четных чисел, которые меньше 4000000 в последовательности Фибоначчи. Так что я пытался сделать это немного функциональный способ, и с помощью пользовательского итератора:Project Euler # 2 in Rust
use std::mem;
static LIMIT: uint = 4000000u;
struct Fibonacci {
current: uint,
next: uint,
limit: uint,
}
fn fibo(lim: uint) -> Fibonacci {
Fibonacci {
current: 1u, next: 1u, limit: lim
}
}
impl Iterator<uint> for Fibonacci {
fn next(&mut self) -> Option<uint> {
let nex = self.current + self.next;
let cur = mem::replace(&mut self.next, nex);
if cur >= self.limit { return None; }
Some(mem::replace(&mut self.current, cur))
}
}
fn main() {
let sum = fibo(LIMIT).filter(|&x| x%2 == 0).fold(0, |sum, x| sum + x);
println!("Sum of fibs : {}", sum);
}
Он выглядит хорошо, и это дает правильную последовательность Фибоначчи (я проверил с println!
с). Проблема в том, что она не дает правильную сумму: она выводит 1089154
, тогда как она должна выводить 4613732
. Мне кажется, что сбрасывает последнее число, но я не понимаю, почему!
Я полный новичок с Rust, поэтому любая помощь будет принята с благодарностью, спасибо!
Вы протестировали ваш итератор Фибоначчи и проверили, что он произвел правильную последовательность чисел? Я [попробовал это здесь] (http://is.gd/ZutSp3), и последние два добавленных числа произведут 3524578, что меньше предела ... и похоже, что именно вас не хватает. –
Спасибо, Matthieu, но вы получите тот же результат, что и я ... Я добавил фальцовку, и это дает мне неправильную сумму: вы можете проверить это [здесь] (http://is.gd/uLKa3G) – flure
Да действительно , мой чек просто показывает, что проблема не в «фильтре», ни в 'fold', а в реализации вашего итератора. –