es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilizando funciones recursivas en R [Error de uso de pila C demasiado cerca del límite]

Tengo que usar una función recursiva para encontrar la suma de enteros positivos \sum{n}^{2n-1}k. Intenté usar la idea de que \sum{n}^{2n-1}k = \sum{1}^{2n-1}k – \sum{1}^{n-1}k. Por lo tanto, esta es mi codificación utilizando una función recursiva.
Código:

penta_recur=function(n){
x = 2*n - 1
y = n - 1
if (n == 1){
return(1)
} else {
return(x+penta_recur(x-1)-y-penta_recur(y-1))
} 
}

Sin embargo, mi salida es un error:

Error: C stack usage  15923328 is too close to the limit

¿Existe una manera de resolver mi problema? Creo que el problema definitivamente tiene algo que ver con la segunda línea de retorno que me hizo arruinar todo el código.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es probable que el problema esté en la segunda línea de retorno. Las funciones recursivas tienden a consumir mucha memoria y cuando se excede el tamaño de la pila, surgen problemas como este.

    Una posible solución a esto es utilizar la recursión de cola. La recursión de cola asegura que la recursión se realice de manera que consuma la memoria mínima pasando el resultado intermedio como argumento. Aquí hay un ejemplo de cómo modificar la función para utilizar la recursión de cola:

    penta_tail=function(n,sum=0){
      x = 2*n - 1
      y = n - 1
      if (n == 1){
        return(sum+1)
      } else {
        return(penta_tail(x-1, sum+x-y) )
      } 
    }
    

    En esta versión de la función, se ha agregado un argumento adicional sum que realiza un seguimiento de la suma hasta el momento. En lugar de restar la suma de la primera mitad de la suma de la segunda mitad, simplemente agregamos la diferencia x-y a la suma y la pasamos como argumento a la llamada recursiva. Al hacer esto, evitamos la acumulación de llamadas de función en la pila de llamadas.

    Ahora puede llamar a esta función con un valor de n para calcular la suma de la secuencia. Por ejemplo:

    penta_tail(3)
    

    Esto debería darle un resultado de 10, que es la suma de los primeros 5 enteros positivos.

Comments are closed.