Actualmente, pude obtener la siguiente función para recuperar el valor máximo de una matriz a través de la recursividad
const max = ([a,...rest]) => !rest.length || a > max(rest) ? a : max(rest); console.log(max([-3,3,19,61,99,22,55])); // 99 console.log(max([32,0,9,87,73])); // 87 console.log(max([1,6,8])); // 8Sin embargo, cuando trato de refactorizarlo con un parámetro adicional "b" a través de la desestructuración, toda la función ya no funcionará correctamente.
const max = ([a,b,...rest]) => !rest.length || a > b ? a : max([b,...rest]); console.log(max([-3,3,19,61,99,22,55])); // 99 console.log(max([32,0,9,87,73])); // 32 console.log(max([1,6,8])); // 6¿Puede alguien amablemente explicarme lo que estoy haciendo mal o indicarme la dirección correcta? Soy nuevo en recursividad y programación, por lo que cualquier ayuda será muy apreciada :)
ACTUALIZAR:
Me tomó un tiempo resolverlo, pero aquí está la solución recursiva con desestructuración:
const max = ([a,b,...rest]) => !rest.length && !b ? a : max([b < a ? a : b,...rest]);!rest.longitud && !b ? a
: max([b < a ? a : b,...descanso]);
Tiene toda la razón al querer arreglar la versión recursiva inicial. llamar al max (rest) dos veces y hacerlo recursivamente para cada lista más pequeña significa que está llamando al max 2 n veces, donde n es la longitud de la entrada. (Es más complejo que eso, variando si n es par o impar, pero aun así crece a ese ritmo).
Así que necesitas arreglar esto. Pero su intento tiene varias fallas fatales, como ya se informó en los comentarios. En primer lugar, es muy posible que esté desestructurando más argumentos que elementos tiene su lista. (¿Cuál sería b en max ([42]) ?) En segundo lugar, cuando llegas a dos elementos ( !rest .length ), siempre devuelves el primero. ¿Y si el segundo es más grande?
Mi enfoque probablemente sería agregar una función auxiliar que tome un máximo de dos elementos y luego usarla para escribir la función principal. Podría verse así:
const max2 = (a, b) => a > b ? a : b const max = ([a, ...rest]) => rest .length == 0 ? a : max2 (a, max (rest)) console.log (max ([-3, 3, 19, 61, 99, 22, 55])); // 99 console.log (max ([32, 0, 9, 87, 73])); // 87 console.log (max ([1, 6, 8])); // 8 Por supuesto, en lugar de una función auxiliar, siempre podríamos usar Math .max , pero eso huele a trampa.
Si tiene una fuerte aversión a las funciones auxiliares, puede usar un parámetro predeterminado en su lugar. Pero creo que este código es más complicado y no muy útil:
const max = ([a, ...rest], b = rest.length ? max (rest) : -Infinity) => rest .length == 0 ? a : a > b ? a : b Aquí usamos -Infinity para un valor garantizado que no sea mayor que cualquier otro valor. Eso también podría ser útil en la versión de fragmentos. En este momento, si pasa max una matriz vacía, devuelve undefined . Si quisiéramos que devolviera -Infinity en su lugar, entonces podríamos predeterminar a -Infinity :
const max = ([a = -Infinity, ...rest], b = rest.length ? max (rest) : -Infinity) => rest .length == 0 ? a : a > b ? a : b max ([]) //=> -Infinity