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)
    }
}

Но это тоже падает при больших n.

Ожидаю получить объяснение: можно ли в Rust безопасно использовать рекурсию для глубоких вычислений? Какие есть альтернативы (например, использование Box для кучи, трейты, итераторы)? Интересует как теоретическая сторона (почему так), так и практические примеры.