保持变量在多个函数调用中生效

时间:2014-03-31 02:35:12

标签: memoization rust collatz

我试图在rust中记忆一个递归的collat​​z序列函数,但是我需要memoized值的hashmap来保持其内容跨越单独的函数调用。是否有一种优雅的方法可以在生锈中执行此操作,或者我是否必须在main中声明hashmap并将其每次传递给函数?我相信每次调用函数时,hashmap都会被重新声明为空映射。这是我的代码:

fn collatz(n: int) -> int {
    let mut map = HashMap::<int, int>::new();
    if map.contains_key(&n) {return *map.get(&n);}
    if n == 1 { return 0; }
    map.insert(n, 
        match n % 2 {
            0 => { 1 + collatz(n/2) }
            _ => { 1 + collatz(n*3+1) }
        }
    );
    return *map.get(&n);
}

另外,当我从HashMap中插入和拉出项目时,为什么需要添加所有&amp;和s?我刚刚做了,因为编译器抱怨并添加修复它但我不确定原因。我不能只是通过价值吗?感谢。

2 个答案:

答案 0 :(得分:3)

Rust中没有“静态”本地人,就像在C中那样,没有。也许制作一个对象,将哈希放入其中,并使collatz成为它的一种方法。

您无法传递值,因为它会复制(复杂键可能很昂贵)或移动(这会使您无法再次使用该键)。在这种情况下,您的密钥只是整数,但API适用于任意类型。

答案 1 :(得分:3)

您可以将thread_local用于线程局部静态。

thread_local! (static COLLATZ_MEM: HashMap<i32, i32> = HashMap::new());
fn collatz(n: i32) -> i32 {
    COLLATZ_MEM.with (|collatz_mem| {
        0  // Your code here.
    })
}

P.S。还有一个优秀的lazy-static宏,可以用于真正的全局静态缓存。 Here是一个例子。