MST

星途 面试题库

面试题:自定义Rust迭代器及与标准库迭代器适配器的协同工作

请实现一个自定义的Rust迭代器,用于生成斐波那契数列。然后展示如何将这个自定义迭代器与标准库中的迭代器适配器(如take、skip、fold等)协同工作,以实现对斐波那契数列的特定需求操作,例如获取前10个斐波那契数的和。
31.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义一个斐波那契数列的迭代器
struct Fibonacci {
    a: u64,
    b: u64,
}

impl Fibonacci {
    fn new() -> Fibonacci {
        Fibonacci { a: 0, b: 1 }
    }
}

impl Iterator for Fibonacci {
    type Item = u64;
    fn next(&mut self) -> Option<Self::Item> {
        let result = Some(self.a);
        let new_b = self.a + self.b;
        self.a = self.b;
        self.b = new_b;
        result
    }
}

fn main() {
    // 获取前10个斐波那契数的和
    let sum_of_first_10 = Fibonacci::new()
       .take(10)
       .fold(0, |acc, num| acc + num);
    println!("前10个斐波那契数的和: {}", sum_of_first_10);

    // 跳过前5个斐波那契数,然后取接下来的3个
    let skipped_and_taken = Fibonacci::new()
       .skip(5)
       .take(3)
       .collect::<Vec<u64>>();
    println!("跳过前5个然后取3个: {:?}", skipped_and_taken);
}
  1. 自定义斐波那契迭代器
    • 定义Fibonacci结构体,它包含两个u64类型的字段ab,分别表示斐波那契数列中的当前值和下一个值。
    • new方法用于初始化迭代器,将a设为0,b设为1。
    • 实现Iterator trait,next方法返回当前的斐波那契数,并更新ab为下一对值。
  2. 与迭代器适配器协同工作
    • taketake(10)用于获取前10个斐波那契数。
    • skipskip(5)用于跳过前5个斐波那契数。
    • foldfold(0, |acc, num| acc + num)用于对迭代器中的值进行累加,从而得到前10个斐波那契数的和。