Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Как включить преобразование хвостовой рекурсии в C#

#c_sharp


static int Ackerman(int x, int y, Func k)
{
    if (x == 0)
        return k(y + 1);
    else if (y == 0)
    {
        return Ackerman(x - 1, 1, k);
    }
    else
    {
        return Ackerman(x, y - 1, r => Ackerman(x - 1, r, k));
    }

}


при значениях параметров 3, 5 переполнение стека.
Как в компиляторе включить функцию преобразования концевого вызова?
    


Ответы

Ответ 1



Принудительно - никак. Для x64 JIT умеет генерировать tail call даже без .tail префикса в IL, но делает это на свое усмотрение, с некоторыми ограничениями, но только при включенной оптимизации (Release, без подключенного отладчика). Попробуйте переключить в Release конфигурацию, выбрать платформу x64, и запустить без отладчика - ваш код отработает. Proposal по tail call на github: https://github.com/dotnet/csharplang/issues/2544

Комментариев нет:

Отправить комментарий