Estoy aprendiendo funciones recursivas. Por diversión, probé el desafío de codificación FizzBuzz.
Estoy atascado porque no entiendo por qué no puedo invertir mi matriz dentro de la función recursiva.
Versión 1
const fizzBuzzRecursive = num => { let results = []; if (num === 1) { return '1'; } else { if (num % 3 === 0 && num % 5 === 0) { results.push('FizzBuzz'); } else if (num % 5 === 0) { results.push('Buzz'); } else if (num % 3 === 0) { results.push('Fizz'); } else { results.push(''+ num); } newResults = results.reverse('') return newResults.concat(fizzBuzzRecursive(num - 1)); } } console.log(fizzBuzzRecursive(5)); // prints [ 'Buzz', '4', 'Fizz', '2', '1' ]Para que funcione, tengo que colocar la función recursiva dentro de otra función.
Versión 2
const fizzBuzz = num => { const fizzBuzzRecursive = num => { let results = []; if (num === 1) { return '1'; } else { if (num % 3 === 0 && num % 5 === 0) { results.push('FizzBuzz'); } else if (num % 5 === 0) { results.push('Buzz'); } else if (num % 3 === 0) { results.push('Fizz'); } else { results.push(''+ num); } return results.concat(fizzBuzzRecursive(num - 1)); } } return fizzBuzzRecursive(num).reverse() }; console.log(fizzBuzz(5)); // prints [ '1', '2', 'Fizz', '4', 'Buzz' ]¿Por qué la versión 1 no funciona correctamente y hay alguna manera de hacer que funcione? ¡Gracias por adelantado!
En su primer ejemplo, está invirtiendo una matriz con un solo elemento y luego concatenándola con la matriz devuelta por la siguiente llamada recursiva. En efecto, esto no revertirá nada y los resultados se concatenarán a partir del nivel más profundo de recursividad.
const fizzBuzzRecursive = num => { let results = []; if (num === 1) { return ['1']; } else { if (num % 3 === 0 && num % 5 === 0) { results.push('FizzBuzz'); } else if (num % 5 === 0) { results.push('Buzz'); } else if (num % 3 === 0) { results.push('Fizz'); } else { results.push(''+ num); } return fizzBuzzRecursive(num - 1).concat(results); } } console.log(fizzBuzzRecursive(5)); // prints [ '1', '2', 'Fizz', '4', 'Buzz' ] Para lograr la inversión, simplemente cambie el orden de la concatenación, y también asegúrese de devolver ['1'] dentro de una matriz como su caso base para asegurarse de que pueda concatenarse con las otras llamadas recursivas.
eche un vistazo a lo siguiente para invertir una matriz
Opción 1
let arr = ['Buzz', '4', 'Fizz', '2', '1' ]; console.log(arr); // returns ['Buzz', '4', 'Fizz', '2', '1'] arr.reverse(); console.log(arr); // returns ['1', '2', 'Fizz', '4', 'Buzz']NB arr.reverse en realidad modifica la matriz.
opcion 2
function recursive(array){ let result = []; array.forEach((value, index) => { result.unshift(value); }) return result; } console.log(recursive(arr)); // returns ['1', '2', 'Fizz', '4', 'Buzz']La explicación de la opción 2 recorre el arr y cambia el valor. El método unshift() agrega nuevos elementos al comienzo de una matriz.