Рекурсивные функции
Go поддерживает рекурсивные функции. Чтобы быть рекурсивной, функция должна вызывать саму себя и в итоге достигать условия остановки.
Ниже testcount() вызывает саму себя снова и снова. Её данные — это переменная x, и каждый новый вызов получает значение на единицу больше (x + 1). Как только x становится равным 11 (x == 11), вызовы прекращаются.
Пример
Вывод: Программа на Go и захваченный вывод
package main
import ("fmt")
func testcount(x int) int {
if x == 11 {
return 0
}
fmt.Println(x)
return testcount(x + 1)
}
func main() {
testcount(1)
}
Пример с факториалом
Рекурсия — распространённая идея и в математике, и в программировании. Её преимущество в том, что данные можно обрабатывать шаг за шагом, пока не будет получен результат.
Однако при написании рекурсивных функций будьте осторожны. Легко получить функцию, которая никогда не завершается или потребляет слишком много памяти или мощности процессора. Но при правильном написании рекурсия может быть и очень эффективной, и математически элегантной.
В этом примере factorial_recursion() вызывает саму себя, каждый раз с x, уменьшенным на 1 (x-1). Вызовы прекращаются, когда x перестаёт быть больше 0, то есть здесь достигает 0.
Пример
Вывод: Программа на Go и захваченный вывод
package main
import ("fmt")
func factorial_recursion(x float64) (y float64) {
if x > 0 {
y = x * factorial_recursion(x-1)
} else {
y = 1
}
return
}
func main() {
fmt.Println(factorial_recursion(4))
}