Digamos que tengo una función simple como esto:operadores en cortocircuito y la recursión de cola
int all_true(int* bools, int len) {
if (len < 1) return TRUE;
return *bools && all_true(bools+1, len-1);
}
Esta función se puede escribir en un estilo más obviamente recursiva de cola de la siguiente manera:
int all_true(int* bools, int len) {
if (len < 1) return TRUE;
if (!*bools) return FALSE;
return all_true(bools+1, len-1);
}
Lógicamente, hay una diferencia cero entre los dos; suponiendo que bools
contiene solo TRUE
o FALSE
(definidos de forma sensata), hacen exactamente lo mismo.
Mi pregunta es: si un compilador es suficientemente inteligente para optimizar el segundo como una llamada recursiva de cola, es razonable esperar que para optimizar el primero de la misma manera, teniendo en cuenta que "& &" cortocircuitos? Obviamente, si se usara un operador sin cortocircuito, esto sería no recursivo de cola porque ambas expresiones se evaluarían antes de que el operador se aplique, pero tengo curiosidad sobre el caso de cortocircuito.
(Antes de recibir una avalancha de comentarios que me dicen que los compiladores de C generalmente no optimizan las llamadas recursivas de cola: considere esta una pregunta general sobre la optimización de llamadas recursivas de cola con operadores de cortocircuito, independientemente del idioma. Estaré encantado de reescribir esto en Scheme, Haskell, OCaml, F #, Python, o qué diablos más si no entiendes C.)
gcc optimiza las llamadas recursivas. – Arafangion