Является ли это хвостовой рекурсией, зависит от того, как код скомпилирован.
Хвостовая рекурсия происходит, когда вы непосредственно возвращаете вызов другой функции (возможно, себе). Оптимизация вызова хвоста (причина, по которой люди заботятся о хвостовой рекурсии) происходит, когда компилятор / интерпретатор замечает это и просто заменяет текущий кадр стека, а не создает другой. В вашем случае, если он скомпилирован наивно, у вас нет хвостовой рекурсии, потому что вы делаете рекурсивный вызов, а затем присваиваете его переменной в стеке вызовов, которую вы позже вернете. Этот шаг присваивания означает, что вы выполняете дополнительные действия после вызова другой функции, что делает ваш код не подходящим для оптимизации хвостового вызова.
Однако хороший компилятор должен переписать ваш код следующим образом:
int takeModulusTAILRECURSION(int coef, int x, int n, int module){
if ( n > 0 )
return takeModulusTAILRECURSION( mod(coef * x, module), x , n - 1, module );
else if ( n == 0)
return mod ( coef , module );
else
return 0;
}
//take modul of an integer ( both negative and positive )
int mod(int x, int modul){
while ( x < 0)
x += modul;
return x % modul;
}
Теперь это хвостовая рекурсия.
Но может ли теперь произойти оптимизация хвостового вызова, зависит от языка и реализации. Например, если ваш код должен быть Java, тогда как Предотвращает ли JVM оптимизацию хвостовых вызовов? указывает, что вы не собираетесь получать оптимизацию хвостовых вызовов независимо от того, что вы делаете.
Редактировать : Я говорил "хвостовая рекурсия" для "хвостовой рекурсии и хвостовой оптимизации оптимизированы".