1 个不稳定版本

0.1.0 2020年6月28日

#1303进程宏

MIT 协议

6KB

memor: Rust的简单记忆宏

用法

只需将 #[memo] 添加到您的函数中。

use memor::memo;
#[memo]
fn fib(n: i64) -> i64 {
    if n == 0 || n == 1 {
        n
    } else {
        fib(n - 1) + fib(n - 2)
    }
}

assert_eq!(12586269025, fib(50));

各种函数都可以进行记忆。因为参数被保存为内部 std::collections::HashMap 的键,所以这个宏可以应用于所有参数都实现了 Eq + Hash 的函数。

use memor::memo;
#[derive(Hash, Eq, PartialEq)]
struct Foo {
    a: usize,
    b: usize,
}

#[memo]
fn foo(Foo { a, b }: Foo, c: usize) -> usize {
    if a == 0 || b == 0 || c == 0 {
        1
    } else {
        foo(Foo { a, b: b - 1 }, c)
            .wrapping_add(foo(Foo { a: a - 1, b }, c))
            .wrapping_add(foo(Foo { a, b }, c - 1))
    }
}

assert_eq!(foo(Foo { a: 50, b: 50 }, 50), 6753084261833197057);

lib.rs:

一个用于记忆函数调用的属性宏

用法

只需将 #[memo] 添加到您的函数中。

use memor::memo;
#[memo]
fn fib(n: i64) -> i64 {
    if n == 0 || n == 1 {
        n
    } else {
        fib(n - 1) + fib(n - 2)
    }
}

assert_eq!(12586269025, fib(50));

各种函数都可以进行记忆。因为参数被保存到内部 std::collections::HashMap 的键中,所以这个宏可以应用于所有参数实现了 HashEq 的函数。

use memor::memo;
#[derive(Hash, Eq, PartialEq)]
struct Foo {
    a: usize,
    b: usize,
}

#[memo]
fn foo(Foo { a, b }: Foo, c: usize) -> usize {
    if a == 0 || b == 0 || c == 0 {
        1
    } else {
        foo(Foo { a, b: b - 1 }, c)
            .wrapping_add(foo(Foo { a: a - 1, b }, c))
            .wrapping_add(foo(Foo { a, b }, c - 1))
    }
}

assert_eq!(foo(Foo { a: 50, b: 50 }, 50), 6753084261833197057);

依赖项

~1.5MB
~35K SLoC