Estoy resolviendo la tarea mini-max en hackerrank.
https://www.hackerrank.com/challenges/mini-max-sum/problem?isFullScreen=true
Para eso, tengo el siguiente código donde uso la recursividad hasta que llego a la longitud de la matriz
let arr = [1,2,3,4,5]; let sumsArr = []; function sumMiniMax(arr, length) { let sum = 0; for(let i = 0;i < arr.length;i++) { if(i != length) { sum += arr[i]; } } sumsArr.push(sum); length = length + 1; if(length == arr.length) { let result = findMinAndMax(sumsArr); console.log('result local', result); return result } else { sumMiniMax(arr, length) } } function findMinAndMax(sumsArr) { return Math.min(...sumsArr) + '\n' + Math.max(...sumsArr) } let res = sumMiniMax(arr, 0); console.log('res', res); en el resultado local, obtengo los resultados esperados 10 and 14 pero después de que se realiza la recursión, quiero devolver el resultado de findMinAndMax a la persona que llama original, que es sumMiniMax
En ese caso, obtengo solo indefinido, pero antes de devolver el valor, podemos ver que la salida correcta en el ámbito local se encuentra en 10 and 14 . Porqué es eso ?
No todas las rutas de código devuelven un valor. Debe propagar su resultado en la pila de llamadas. en tu caso el
return sumMiniMax(arr, length); falta en la rama else de su función sumMiniMax() .
Creo que la recursividad en este caso es una especie de exceso de ingeniería. La tarea tiene un enfoque sencillo:
function miniMaxSum(arr) { const sumWithout = (el) => { const elIndex = arr.indexOf(el); const arrWithout = arr.filter((_, i) => i !== elIndex); return arrWithout.reduce((sum, num) => sum + num); }; const maxEl = Math.max(...arr); const minEl = Math.min(...arr); console.log(sumWithout(maxEl), sumWithout(minEl)); }; miniMaxSum([1,2,3,4,5]); .as-console-wrapper{min-height: 100%!important; top: 0}Puede adoptar un enfoque de bucle único al tener una suma de los tres valores no mínimos y no máximos y mantener el valor mínimo y máximo para agregarlos más tarde.
function getMinMax(array) { let min = array[0] < array[1] ? array[0] : array[1], max = array[0] > array[1] ? array[0] : array[1], sum = 0; for (let i = 2; i < array.length; i++) { const value = array[i]; if (min > value) { sum += min; min = value; continue; } if (max < value) { sum += max; max = value; continue; } sum += value; } return [min + sum, max + sum].join(' '); } console.log(getMinMax([1, 2, 3, 4, 5]));