何时在Rust中保证尾递归?

问题描述 投票:1回答:1

C语言

在C编程语言中,很容易使用tail recursion

int foo(...) {
    return foo(...);
}

只需返回,就像递归调用的返回值一样。当此递归可能重复一千甚至一百万次时,这一点尤其重要。它会使用很多堆栈上的内存

铁锈

现在,我有一个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),
    }
}

((这是一个最小的示例,真实的示例更复杂,但它捕获了主要思想)

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

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

例如,如果我们声明一些需要像std::Vec一样销毁的变量,它将在递归调用之前(允许尾部递归)或在递归调用返回之后(禁止尾部递归)销毁。 ?

recursion rust tail-recursion
1个回答
0
投票
只要在

tail position(基本上是该函数的最后一条语句)中调用递归函数,就可以保证Tail calls

尽管优化器可以

选择执行它,但Rust永远不会保证尾部调用优化。]

另请参见:

© www.soinside.com 2019 - 2024. All rights reserved.