相关疑难解决方法(0)

Rust 什么时候保证尾递归?

C语言

在 C 编程语言中,很容易出现尾递归

int foo(...) {
    return foo(...);
}
Run Code Online (Sandbox Code Playgroud)

只需返回递归调用的返回值即可。当这种递归可能重复一千次甚至一百万次时,这一点尤其重要。它会在堆栈上使用大量内存

现在,我有一个 Rust 函数,它可以递归地调用自己一百万次:

fn read_all(input: &mut dyn std::io::Read) -> std::io::Result<()> {
    match input.read(&mut [0u8]) {
        Ok (  0) => Ok(()),
        Ok (  _) => read_all(input),
        Err(err) => Err(err),
    }
}
Run Code Online (Sandbox Code Playgroud)

(这是一个最小的例子,真正的例子更复杂,但它抓住了主要思想)

这里,递归调用的返回值按原样返回,但是:

它是否保证 Rust 编译器会应用尾递归?

例如,如果我们声明了一个像 a 这样需要销毁的变量,std::Vec它会在递归调用之前(允许尾递归)还是在递归调用返回之后(禁止尾递归)被销毁?

recursion tail-recursion rust

32
推荐指数
2
解决办法
6870
查看次数

标签 统计

recursion ×1

rust ×1

tail-recursion ×1