Estoy trabajando en el curso de javascript en freecodecamp y estoy confundido con la lección sobre funciones recursivas.
Tengo dificultad para entender el siguiente código:
function sum(arr, n) { if(n<=0) { return 0; } else { return sum(arr, n-1) + arr[n-1]; } } sum([10,20,30,40], 3);La parte específica con la que estoy luchando es esta:
¿La línea de retorno no devolvería sum([10,20,30,40], 3-1) + arr[3-1] dando como resultado 30+30 = 60?
Cualquier ayuda con esto sería muy apreciada. O incluso señalándome en la dirección correcta para investigar esto más a fondo.
Gracias
Escribamos el código original de una forma más intuitiva poniendo arr[n-1] primero. De esta forma podemos seguir expandiendo cada llamada a sum() hacia la derecha.
Pero primero anotemos qué llamada sum(arr, n) devolverá para cada n
if n > 0 => arr[n-1] + sum(arr, n-1) if n == 0 => 0 n == 3 => arr[2] + sum(arr, 2) n == 2 => arr[1] + sum(arr, 1) n == 1 => arr[0] + sum(arr, 0) n == 0 => 0Ahora ampliamos nuestros pasos:
sum(arr, 3) == arr[2] + sum(arr, 2) // expand sum(arr,2) where n = 2 == arr[2] + arr[1] + sum(arr, 1) // expand sum(arr,1) == arr[2] + arr[1] + arr[0] + sum(arr,0) // expand sum(arr,0) == arr[2] + arr[1] + arr[0] + 0 == 30 + 20 + 10 + 0Prueba con
function sum(arr, n) { console.log(`calling sum(arr, ${n})`); if(n<=0) { console.log(`returning 0`); return 0; } else { console.log(`calculating [sum(arr, ${n-1}) + ${arr[n-1]}]`); let s = sum(arr, n-1);; console.log(`returning [sum(arr, ${n-1}) + ${arr[n-1]}] = [${s} + ${arr[n-1]}]`); return s + arr[n-1]; } } sum([10,20,30,40], 3);La salida será:
llamando suma (arr, 3)
calculando [suma(arr, 2) + 30]
llamando suma (arr, 2)
calculando [suma(arr, 1) + 20]
llamando suma (arr, 1)
calculando [suma(arr, 0) + 10]
llamando suma (arr, 0)
regresando 0
devolviendo [suma(arr, 0) + 10] = [0 + 10]
devolviendo [suma(arr, 1) + 20] = [10 + 20]
devolviendo [suma(arr, 2) + 30] = [30 + 30]
Otros dos ejemplos clásicos de funciones recursivas simples son factorial y fibonacci, porque esas dos fórmulas en sí mismas son recursivas. La multiplicación también podría calcularse recursivamente, si piensa que a * b es a + (a + ...) donde a se suma b veces.
Si está tratando de codificar esas funciones, hay una sugerencia para codificar este último ejemplo:
5 * 10 es igual a 5 + 5 * 9, que es igual a 5 + 5 + 5 * 8 y así sucesivamente.
sum([10,20,30,40], 3-1) Volverá a llamar a la función sum, piénsalo.