La respuesta correcta es que esta función no termina para todos los enteros (específicamente, no termina en -1). Su amigo tiene razón al afirmar que se trata de pseudocódigo y que el pseudocódigo no termina en un desbordamiento de pila. El pseudocódigo no está formalmente definido, pero la idea es que haga lo que dice la lata. Si el código no dice "terminar con un error de desbordamiento de pila", entonces no hay error de desbordamiento de pila.
Incluso si este fuera un lenguaje de programación real, la respuesta correcta sería "no termina", a menos que el uso de una pila sea parte de la definición del lenguaje. La mayoría de los lenguajes no especifican el comportamiento de los programas que pueden desbordar la pila, porque es difícil saber con precisión cuánta pila usará un programa.
Si ejecutar el código en un intérprete o compilador real provoca un desbordamiento de la pila, en muchos idiomas, es una discrepancia entre la semántica formal del lenguaje y la implementación. En general, se entiende que las implementaciones de un lenguaje solo harán lo que se puede hacer en una computadora concreta con memoria finita. Si el programa muere con un desbordamiento de pila, se supone que debe comprar una computadora más grande, recompilar el sistema si es necesario para admitir toda esa memoria e intentarlo nuevamente. Si el programa no finaliza, es posible que deba seguir haciendo esto para siempre.
Incluso el hecho de que un programa desborde o no la pila no está bien definido, ya que algunas optimizaciones, como la optimización y la memorización de llamadas de cola, pueden permitir una cadena infinita de llamadas a funciones en un espacio de pila con límite constante. Algunas especificaciones de lenguaje incluso exigen que las implementaciones realicen la optimización de llamadas de cola cuando sea posible (esto es común en lenguajes de programación funcionales). Para esta función, se expande a ; la llamada externa a es una llamada de cola, por lo que no empuja nada en la pila, por lo tanto solo va a la pila, y eso regresa , por lo que la pila vuelve al mismo estado en el que estaba al principio. Por lo tanto, con la optimización de llamadas de cola se repite para siempre en la memoria constante.f(-1)
f(f(-2))
f
f(-2)
-1
f(-1)