Errores de funciones al ejecutar: recursión sin fin y funciones sin valor

Estos errores aparecen cuando una función se llama a sí misma sin parar (le falta el caso base) o cuando una función termina sin haberle dado valor a lo que debía devolver.

Qué significa

Error al ejecutar en la línea 2
Demasiadas llamadas a funciones, una dentro de otra. ¿Una función recursiva que nunca llega a su caso base?

Una función puede llamarse a sí misma; a eso se le llama recursión. Para que funcione, necesita un caso base: una situación en la que ya no se llama más y responde directo. Sin caso base, las llamadas se apilan una dentro de otra sin fin, y Jaguar se detiene al llegar a un límite.

El otro error es más sencillo: una función con valor de retorno (Funcion r <- doble(n)) tiene que darle un valor a r antes de terminar.

Ejemplos y cómo arreglarlos

Recursión sin caso base

Funcion r <- f(n)
    r <- f(n + 1)
FinFuncion

Algoritmo a
    Escribir f(1)
FinAlgoritmo

Esta función siempre se llama a sí misma. Agrega el caso base, el momento en que responde sin llamar de nuevo:

Funcion r <- suma(n)
    Si n = 0 Entonces
        r <- 0
    SiNo
        r <- n + suma(n - 1)
    FinSi
FinFuncion

Algoritmo a
    Escribir suma(4)
FinAlgoritmo

Una función que no devuelve nada

Funcion r <- doble(n)
    n <- n * 2
FinFuncion

Algoritmo a
    Escribir doble(4)
FinAlgoritmo

Error al ejecutar en la línea 5
La función 'doble' terminó sin darle un valor a 'r'.

El resultado hay que guardarlo en r, el nombre que va después de Funcion:

Funcion r <- doble(n)
    r <- n * 2
FinFuncion

Algoritmo a
    Escribir doble(4)
FinAlgoritmo

Por qué aparece

  • La recursión no tiene caso base, o el caso base nunca se alcanza porque el valor se aleja en vez de acercarse.
  • Se llama a la función con el mismo dato una y otra vez.
  • Se escribió el resultado en otra variable y no en la que nombra la función.
  • El valor se asigna dentro de un Si que no siempre se cumple.

Cómo evitarlo

Escribe primero el caso base y después el caso que se llama a sí mismo, y comprueba que cada llamada se acerca un paso al caso base: n - 1 se acerca a 0, n + 1 se aleja. Para las funciones normales, que el nombre del resultado siempre reciba un valor, con un SiNo si hace falta.

Preguntas frecuentes

¿Cuántas llamadas aguanta Jaguar?

Hasta 200 llamadas, una dentro de otra. Una recursión legítima, como sumar hasta 190, funciona sin problema.

¿Puedo evitar la recursión?

Casi siempre sí: un ciclo Para o Mientras hace lo mismo. La recursión es una forma más corta de escribir ciertos problemas, pero no es obligatoria.

Sigue aprendiendo