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.

Estoy teniendo dificultades para comprender este problema simple de recursividad.

Este código es del libro “The Bastards Book of Ruby” y lo único que hace es encontrar el número más grande. Se presenta como un ejemplo para tratar de entender la recursividad. http://ruby.bastardsbook.com/chapters/recursion/

def rock_judger(rocks_arr)    
  if rocks_arr.length <= 2  # el caso base
    a = rocks_arr[0]
    b = rocks_arr[-1]
  else
    a = rock_judger(rocks_arr.slice!(0,rocks_arr.length/2))
    b = rock_judger(rocks_arr)
  end    
  return a > b ? a : b
end

Para probarlo, llamé al método con el arreglo [1, 2, 3, 4, 30, 31, 32, 34] e investigué qué está sucediendo exactamente usando la gema pry-byebug.

La primera vez que se ejecuta, se utiliza el método slice! en el arreglo y obtenemos [1,2,3,4]. Esto se ejecuta nuevamente y se realiza el método slice! nuevamente, devolviendo [1,2]. Luego, en este punto, se asigna a = 1 y b = 2.

1

Ahora llegamos al método de retorno. 2 > 1, por lo que devuelve b. Pero en lugar de devolver solo el número entero 2, ¡vuelve a la línea 15!

2

Mi pregunta es, ¿cómo es esto posible? ¿No debería simplemente devolver 2?

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la que el código vuelve a la línea 15 después de devolver b es porque la función se llama de forma recursiva, lo que significa que se llama a sí misma varias veces hasta que alcanza el caso base (donde la longitud del array es menor o igual a 2). Una vez que alcanza el caso base, comienza a devolver valores hacia arriba en la pila de llamadas, por eso lo vemos volviendo a la línea 15 en la segunda imagen.

    En esencia, la función se llama varias veces con arrays cada vez más pequeños hasta que alcanza el caso base, y luego comienza a devolver valores hacia arriba en la pila de llamadas hasta que alcanza la llamada original a rock_judger con todo el array.

Comments are closed.