Нет, нельзя сказать компилятору, что требуется рекурсия хвоста. Некоторые компиляторы (никто из них, о которых я знаю) могут поддерживать аннотации, специфичные для реализации, но для этого требуется, чтобы пользователь использовал этот конкретный компилятор. Некоторые другие компиляторы в некоторых режимах намеренно не поддерживают хвостовые вызовы, поскольку они могут обеспечить лучший отладочный опыт, не поддерживая хвостовые вызовы. Пользователь может использовать такой компилятор.
Допустимая глубина рекурсии очень зависима от программ, функций и реализаций, и для нее нельзя дать разумные цифры. Учитывая определенную платформу, вы, вероятно, можете определить размер стека по умолчанию, исследовать размер фрейма для одного конкретного компилятора на этой платформе и сделать простое разделение, чтобы получить приблизительную оценку количества вложенных вызовов, которые вы можете иметь.
Я рекомендую переписать его таким образом, чтобы он ясно дал понять читателю, что происходит, но не полагается на оптимизацию хвостовых вызовов компилятора. Хотя ненависть, заявление goto
может быть очень полезно для этого.
Возьмет простую хвостовую рекурсию функции битого подсчета:
int bitcount(unsigned int n, int acc = 0) {
if (n == 0)
return acc;
return bitcount(n >> 1, acc + (n & 1));
}
Это может быть тривиальным переписан в
int bitcount(unsigned int n, int acc = 0) {
tail_recurse:
if (n == 0)
return acc;
// tail return bitcount(n >> 1, acc + (n & 1));
acc += n & 1;
n = n >> 1;
goto tail_recurse;
}
Конечно, это простой вариант, который тривиальным переписан, чтобы избежать рекурсий полностью , и, вероятно, даже не нужно выполнять вручную, но конкретное преобразование, которое я использовал здесь, - это тот, который вы можете применить к любой функции, где возможна рекурсия хвоста и где вам нужна рекурсия хвоста. Комментарий должен убедиться, что читатель все еще может легко определить, что происходит.
Сколько хвостов вы ожидаете примерно?Какие компиляторы вы используете? – Guvante
Если это действительно рекурсивный хвост, и вы должны точно знать, что компилятор будет оптимизировать рекурсию, должно быть просто закодировать его как цикл самостоятельно. – jxh
См. [Этот ответ] (http://stackoverflow.com/a/30090390/315052), чтобы найти другие причины, по которым функция хвостовой рекурсии не может быть оптимизирована. – jxh