En informática, la recursión mastica un recurso valioso y limitado, la pila, y puede llevar a un tipo de error de tiempo de ejecución irrecuperable: el temido StackOverflow. Sin embargo, la recursión de cola es una forma de recursión que no utiliza ningún espacio de pila y, por lo tanto, es una forma de usar la recursión de forma segura.
freeRam () es la función para probar el uso de la memoria
static int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Estoy probando en arduino, para ver la diferencia del uso de memoria entre la forma recursiva y la forma recursiva de la cola
// recursive way
int recsum(int x){
if(x==1)
return x;
else
return recsum(x-1) +x;
}
// tail recursive
int tailrecsum(int x, int total){
if(x==1)
return total;
else
return tailrecsum(x-1,total+x);
}
sin embargo
void setup() {
Serial.begin(9600);
Serial.println( recsum(1000) );
Serial.println(freeRam());
}
recursión 1000 veces salidas aún 1858 bytes disponibles
void setup() {
Serial.begin(9600);
Serial.println( tailrecsum(1000, 0) );
Serial.println(freeRam());
}
retroceso de cola 1000 veces salidas también 1858 bytes disponibles
La prueba muestra que la forma de recursión y de cola en arduino no afecta el uso de la memoria, por lo que estoy muy confundido y al respecto, y tengo dudas sobre mis resultados.