Рекурсия функции в Rust
В программировании есть такое понятие, как рекурсия - это когда функция вызывает сама себя. Каждый следующий вызов должен получать задачу проще, и нужна явная остановка. Без нее цепочка вызовов не закончится.
Параметр при этом передают в саму функцию, но уже с более простым
значением. Посчитаем сумму чисел от единицы до n. Пока
n больше единицы, к нему прибавляют сумму для числа на
единицу меньше:
fn func(n: i32) -> i32 {
if n <= 1 {
return n;
}
n + func(n - 1)
}
fn main() {
println!("{}", func(4)); // выведет 10
}
Базовый случай n <= 1 обрывает цепочку: функция больше не
вызывает сама себя и отдает текущее число. Дальше ответы
складываются на обратном пути.
Учтите, что без условия остановки получится бесконечный вызов. Функцию нельзя запускать рекурсивно, если шаг не становится проще.
Факториал для малого аргумента устроен так же. Для типа i32
не берите число больше 12: уже следующее значение не
помещается в этот тип.
fn fact(n: i32) -> i32 {
if n <= 1 {
return 1;
}
n * fact(n - 1)
}
fn main() {
println!("{}", fact(5)); // выведет 120
}
Дано число:
let k = 3;
Напишите рекурсивный блок, который отдает сумму от 1 до
k, и выведите результат.
Дан следующий код:
fn func(n: i32) -> i32 {
if n <= 0 {
return 0;
}
func(n - 1)
}
Выведите результат для 3 и объясните стоп-условие.
С помощью рекурсии выведите на экран числа от 1 до 5
. В параметр каждого следующего вызова передавайте число на
единицу больше.
Скажите, зачем в рекурсии нужен случай без нового вызова.