Оптимизация хвостовых вызовов в Go
Проблема: В настоящее время язык программирования Go оптимизирует хвостовые вызовы? Если нет, то хотя бы оптимизирует ли он хвостовые рекурсивные вызовы функции к самой себе?
3 ответ(ов)
В дополнение к отличному ответу @Rostyslav, если вам необходимо использовать хвостовой вызов (в данном примере — хвостовую рекурсию), вы можете сделать что-то подобное:
package main
import "fmt"
func tail(i int) {
if i == 0 {
return
} else {
fmt.Println(i)
tail(i - 1) // хвостовой рекурсивный вызов
}
}
func main() {
tail(3) // вывод: 3, 2, 1
}
Такой подход позволяет использовать рекурсию для вывода значений в порядке убывания. Однако имейте в виду, что использование рекурсии в Go может привести к переполнению стека при слишком больших значениях. На практике лучше рассмотреть использование цикла для крайне глубоких рекурсий.
Я только что написал новую библиотеку для работы с этим ограничением, благодаря появлению новой функции обобщений в Go 1.18. Теперь возможно создание безопасных по типам функций, взаимно рекурсивных и без стеков.
Вот ссылка на библиотеку: kandu/go_tailcall.
Нет, это не так. Согласно информации от основной команды разработчиков в рассылке, также нет никаких планов на это.
Существует ли цикл foreach в Go?
Как сопоставить любой символ на нескольких строках в регулярном выражении?
Отформатировать строку в Go без вывода?
Есть ли способ получить доступ к приватным полям структуры из другого пакета?
Получение тега поля структуры с использованием пакета reflect в Go