# Функции и рекурсия Функция объявляется ключевым словом `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)