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.
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!
Mi pregunta es, ¿cómo es esto posible? ¿No debería simplemente devolver 2?
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.