Как реализовать рекурсию в 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 для кучи, трейты, итераторы)? Интересует как теоретическая сторона (почему так), так и практические примеры.
Ответов пока нет.
Войдите чтобы оставить ответ