0

Оптимизация хвостовых вызовов в Go

16

Проблема: В настоящее время язык программирования Go оптимизирует хвостовые вызовы? Если нет, то хотя бы оптимизирует ли он хвостовые рекурсивные вызовы функции к самой себе?

3 ответ(ов)

0

В дополнение к отличному ответу @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 может привести к переполнению стека при слишком больших значениях. На практике лучше рассмотреть использование цикла для крайне глубоких рекурсий.

0

Я только что написал новую библиотеку для работы с этим ограничением, благодаря появлению новой функции обобщений в Go 1.18. Теперь возможно создание безопасных по типам функций, взаимно рекурсивных и без стеков.

Вот ссылка на библиотеку: kandu/go_tailcall.

0

Нет, это не так. Согласно информации от основной команды разработчиков в рассылке, также нет никаких планов на это.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь