Вложенные и рекурсивные функции


Вложенные функции
Одни функции могут содержать другие функции. Вложенные функции еще называются локальными. Локальная функция доступна только в рамках той функции, внутри которой она определена. Как правило, локальная функция оформляет блок действий, которые могут многократно использоваться в рамках внешней функций, но вне этой внешней функции больше нигде не используются.

Например, определим функцию, которая вычисляет разницу площадей двух окружностей:

1
2
3
4
5
6
7
8
9
10
11
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, то ее можно определить как локальную.

Рекурсивные функции
Рекурсивные функции представляют особые функции, которые могут вызывать сами себя. Традиционным примером подобных функций служат функции вычисления факториала и чисел Фибоначчи. Например, функция факториала:

1
2
3
4
5
6
7
8
9
10
11
func factorial(_ n: Int) -> Int{

if n == 0{

return 1
}

return n * factorial(n-1)
}

var x = factorial(6) // 720
Здесь функция факториала возвращает 1, если переданное в функцию число равно 0. Иначе функция вызывает саму себя.

Другой пример - функция вычисления чисел Фибоначчи:

1
2
3
4
5
6
7
8
9
10
11
12
13
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