Одни функции могут содержать другие функции. Вложенные функции еще называются локальными. Локальная функция доступна только в рамках той функции, внутри которой она определена. Как правило, локальная функция оформляет блок действий, которые могут многократно использоваться в рамках внешней функций, но вне этой внешней функции больше нигде не используются.
Например, определим функцию, которая вычисляет разницу площадей двух окружностей:
func compare(_ r1: Double, _ r2: Double){ func square(_ r: Double) -> Double{ return r * r * 3.14} let s1 = square(r1) let s2 = square(r2) print("разница площадей:", (s1 - s2)) } compare(16.0, 15.0)
И чтобы не писать повторно один и тот же код для каждой окружности, можно определить одну функцию и затем многократно ее вызывать. И если не планируется использовать эту функцию в других частях программы вне функции compare, то ее можно определить как локальную.
Рекурсивные функции представляют особые функции, которые могут вызывать сами себя. Традиционным примером подобных функций служат функции вычисления факториала и чисел Фибоначчи. Например, функция факториала:
func factorial(_ n: Int) -> Int{ if n == 0{ return 1 } return n * factorial(n-1) } var x = factorial(6) // 720
Здесь функция факториала возвращает 1, если переданное в функцию число равно 0. Иначе функция вызывает саму себя.
Другой пример - функция вычисления чисел Фибоначчи:
func fibbonachi(_ n: Int) -> Int{ if n == 0{ return 0 } else if n == 1{ return 1 } return fibbonachi(n-1) + fibbonachi(n-2) } var z = fibbonachi(6) // 8