Хвостовая рекурсия [C]

Вопрос в моей книге: "Какие из рекурсивных вызовов (не функций!) Являются хвостовыми рекурсивными?"

unsigned f(unsigned x) 
{ 
    if(x==0) return 1; 
    else if(x==1) return f(x-1); 
    else return 3*x + f(x-1); 
}

В этом примере я предполагаю, что первый - хвостовой рекурсивный, а второй - нет. Однако, что происходит в следующем случае, где мы также имеем printf() до и после рекурсивного вызова (ов)?

void f(unsigned x) 
{
    if(x==0) return;
    else if(x==1) { f(x-1); printf("1"); }
    else if(x==2) { printf("2"); f(x-1); }
    else f(x-3);
}

Учитывая то, что я до сих пор знаю о хвостовой рекурсии, я предположил, что первый нет, а второй и третий - нет? Я не прав, и если да, не могли бы вы объяснить, как это работает?

1 ответ

В первом примере вы правы, что только первый вызов потенциально рекурсивен.

Во втором примере первый вызов printf() потенциально является хвостовым вызовом, а второй и третий вызов f() потенциально хвост рекурсивны.

Это зависит от деталей вашей реализации, и хотя используемый ABI может дать подсказку (вот почему вызов f() более вероятно, будет хвост-рекурсивным, чем вызов printf() фальшивый вызов), это доказательство явно слабое.
Стандарт молчит по этим вопросам.

Другие вопросы по тегам