#c_sharp
static int Ackerman(int x, int y, Funck) { 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
Комментариев нет:
Отправить комментарий