¿Puede alguien explicarme por qué necesitamos (n-1) en el siguiente código?
function multiply(arr, n) { if (n <= 0) { return 1; } else { return multiply(arr, n - 1) * arr[n - 1]; } } Entiendo que tenemos un caso base de if (n <= 0){return 1} para que el código no se repita para siempre, pero no entiendo (n-1) y [n-1] en el caso recursivo de return multiply(arr, n - 1) * arr[n - 1]; .
Cualquier ayuda es muy apreciada.
Parece que esta función está destinada a comenzar con el último elemento de la matriz y operar recursivamente en cada elemento anterior. Esta es la razón por la cual, al llamar a la función de forma recursiva, debe pasar el siguiente elemento anterior, es decir, n-1 . Esto acerca la función al caso base con cada iteración.
La función podría mejorarse, pero puede entenderla tal como está agregando algunos registros de depuración...
function multiply(arr, n) { if (n <= 0) { return 1; } else { console.log(`recurse to multiply ${arr[n-1]} by elements in [${arr.slice(0,n-1)}]`); return multiply(arr, n - 1) * arr[n - 1]; } } multiply([1, 2, 3], 3);Una implementación más clara no requeriría el parámetro de longitud y sería más clara acerca de la descomposición...
// if the array has a first element, multiply it by the remainder of the array function multiply(arr) { return arr.length ? arr[0] * multiply(arr.slice(1)) : 1; } console.log(multiply([1,2,3]))Esta función simplemente multiplica todos los elementos de la matriz dada. Inicialmente, debe pasar la matriz y su longitud como n .
El último elemento de cualquier matriz es n-1 . Por lo tanto, en la primera iteración, tomará el último elemento y lo multiplicará más hasta que llegue a 0. Luego se detendrá.
Solo intente ejecutar esta función mentalmente en su cabeza con algunos ejemplos simples y lo obtendrá.