#迭代器 #记忆化 #缓存 #实用工具 # #斐波那契序列

memoiter

迭代器的记忆化,以便可以索引其先前结果

3个稳定版本

2.0.0 2020年11月29日
1.0.1 2020年11月28日

缓存类别中排名225

MIT许可证

16KB
252

MemoIter

MemoIter是一个小的Rust库,实现了记忆化迭代器,它将一个普通的Iterator<Item=T>与一个拥有自己的Vec<T>配对,以存储它返回的项目。或者,它可以被视为一个包装了Vec<T>,该包装器会从迭代器中懒加载项目。

这对于无限迭代器很有用,其中每个值都依赖于前一个值,例如阶乘函数:计算1000的阶乘相当昂贵,但它也产生了,作为副产品,999998等的阶乘。如果将这些值存储起来,以后可以检索它们,而无需重新计算。

示例

以下示例展示了如何使用MemoIter来缓存计算斐波那契序列的结果。

use memoiter::MemoIter;
use std::iter::successors;


fn main() {
    let mut fibonacci: MemoIter<_, u32> = successors(
        Some((0, 1)),
        |&(a, b)| Some((b, b + a)),
    ).map(|p| p.0).into();

    assert_eq!(fibonacci.get(0), Some(&0));
    assert_eq!(fibonacci.get(1), Some(&1));
    assert_eq!(fibonacci.get(4), Some(&3));
    assert_eq!(fibonacci.get(9), Some(&34));

    //  This value was calculated as a byproduct of calculating 4, and is simply
    //      retrieved here.
    assert_eq!(fibonacci.get(3), Some(&2));

    let (seq, _) = fibonacci.consume();
    assert_eq!(seq, [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]);
}

无运行时依赖