Aller au contenu principal
U/
Traits
rust

impl Iterator pour un itérateur de Fibonacci

Définir la struct Fib et implémenter le trait Iterator<Item = u64> pour qu'elle produise la suite de Fibonacci terme par terme, utilisable avec .take(10).collect().

45 minPublié le 20 mai 2026Proposé par Anonyme

Défi

// Lisez attentivement, codez sur votre machine

Énoncé

Déclarer la struct Fib { a: u64, b: u64 }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 : next ne retourne jamais None.
  • Utiliser u64 pour 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]
Espace solution

Proposer une solution

Connectez-vous ou créez un compte pour envoyer votre code (aucune exécution côté serveur — on stocke juste le texte pour la communauté).

// À garder en tête
  • D'abord, faire marcher

    On ne cherche pas à optimiser : d'abord, on fait marcher le truc. Optimiser vient ensuite — et ça aussi, ça s'apprend. (Si un défi porte sur l'optimisation, son énoncé le précise.)

  • Pas de mauvaise réponse

    Il n'y a pas de mauvaise réponse à un défi. Le but, c'est de le faire. Ce qui compte, c'est de s'entraîner.

  • Trop dur ? Au suivant

    Un défi te résiste ? N'hésite pas à en prendre un autre. Ils seront encore là demain.