Défi
Énoncé
Déclarer la struct Fib { a: u64, b: u64 } où a et b sont les deux derniers termes calculés. Implémenter Iterator pour Fib : la méthode next retourne Some(self.a) puis met à jour l'état interne avec (self.a, self.b) = (self.b, self.a + self.b). Fournir une fonction ou méthode associée Fib::new() -> Self qui initialise l'itérateur avec a = 0, b = 1. Dans main, utiliser .take(10).collect::<Vec<u64>>() pour récupérer les dix premiers termes et les afficher avec println!.
Contraintes
- Compilé avec
rustc --edition=2021 main.rs. - L'itérateur est infini :
nextne retourne jamaisNone. - Utiliser
u64pour supporter les termes jusqu'à F(93) sans débordement. - L'état interne doit être entièrement contenu dans la struct (pas de variable globale ni de closure).
- Les méthodes de l'API
Iterator(take,collect,sum, etc.) doivent être utilisables sans implémentation supplémentaire.
Exemple
struct Fib { a: u64, b: u64 }
impl Fib {
fn new() -> Self { Fib { a: 0, b: 1 } }
}
impl Iterator for Fib {
type Item = u64;
fn next(&mut self) -> Option<u64> {
let val = self.a;
let next_b = self.a + self.b;
self.a = self.b;
self.b = next_b;
Some(val)
}
}
fn main() {
let suite: Vec<u64> = Fib::new().take(10).collect();
println!("{:?}", suite);
}
Sortie :
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]