Ricorsione della coda in C

Stavo cercando di scrivere la funzione di ricorsione, per trovare fattoriale di un numero.

int factorial(int input,int *answer) { if ( input ==0 ) { return 0; } *answer = *answer * input; factorial(input -1, answer); } 

Cosa dirai di questa funzione? È coda ricorsiva?

Quando si eseguono le funzioni ricorsive della coda (in particolare le funzioni ricorsive della coda) è spesso utile avere una funzione di supporto in aggiunta a un’altra funzione che ha un’interfaccia più amichevole. La funzione di interfaccia amichevole in realtà imposta solo gli argomenti della funzione meno amichevole.

 static unsigned factorial_helper(unsigned input, unsigned acc) { if (intput == 0) { return acc; } return factorial_helper(input-1, acc * input); } unsigned factorial(int input) { if (input < 0) { do_something_bad(); } return factorial_helper(input, 1); } 

Passando un valore dell'accumulatore si evita di dover utilizzare i puntatori o eseguire calcoli al ritorno dalle funzioni chiamate, il che rende le funzioni ricorsive.

Ecco un link con una definizione: http://phoenix.goucher.edu/~kelliher/cs23/feb21.html

“Una funzione è ricorsiva in coda se l’ultima cosa che fa è la sua chiamata ricorsiva.”

Nel codice che hai postato, l’ultima cosa che fa la funzione è creare una chiamata ricorsiva a se stessa, quindi con questa definizione, è ricorsiva in coda.