45 lines
1.7 KiB
Markdown
45 lines
1.7 KiB
Markdown
# Функции и рекурсия
|
|
|
|
Функция объявляется ключевым словом `fn`, именем, списком типизированных аргументов и, если функция возвращает значение, типом результата.
|
|
|
|
```
|
|
fn sum(uint a, uint b) uint
|
|
{
|
|
return a + b;
|
|
}
|
|
```
|
|
|
|
Если функция ничего не возвращает, тип после закрывающей скобки можно опустить.
|
|
Вызов записывается как `name(arg1, arg2)`, аргументы передаются в порядке объявления.
|
|
|
|
## Возврат
|
|
|
|
return завершает текущую функцию.
|
|
Возвращаемое выражение должно быть совместимо с объявленным типом.
|
|
Пустой return; используется в функции без результата.
|
|
Возврат вне функции — ошибка компиляции.
|
|
|
|
## Рекурсия
|
|
|
|
Функция может вызывать саму себя:
|
|
|
|
```
|
|
fn factorial(uint n) uint
|
|
{
|
|
if (n <= 1)
|
|
return 1;
|
|
return n * factorial(n - 1);
|
|
}
|
|
```
|
|
|
|
Каждый вызов получает собственное окружение.
|
|
ВМ хранит адрес возврата в стеке вызовов, а локальные значения — в стеке окружений.
|
|
|
|
При возврате объекта компилятор переносит его владение в родительское окружение.
|
|
|
|
---
|
|
|
|
Далее: [Классы и объекты](./05_classes-and-objects.md)
|
|
|
|
Назад: [Управление потоком](./03_control-flow.md)
|