Avatar ·

如何在Rust中实现递归?

大家好!我尝试在Rust中实现一个计算阶乘的递归函数,但遇到了一个意想不到的问题。我写了一个简单的代码:

fn factorial(n: u32) -> u32 {
    if n == 0 {
        1
    } else {
        n * factorial(n - 1)
    }
}

fn main() {
    println!("{}", factorial(5));
}

代码可以编译并运行,但当尝试增加递归深度(例如 factorial(20000))时,程序因栈溢出而崩溃。我知道Rust没有尾递归优化,这是意料之中的。然而,我想了解当递归深度可能很大时,如何在Rust中正确实现递归。

我已经尝试过的方法:

  • 使用带有循环的迭代方法(可行,但我想要递归)
  • 尝试使用累加器编写尾递归:
fn factorial_tail(n: u32, acc: u32) -> u32 {
    if n == 0 {
        acc
    } else {
        factorial_tail(n - 1, n * acc)
    }
}