Buenos días. Tengo un problema con un método recursivo, este método imprimirá números en la ventana. la función dado un número n, imprime siguiendo un patrón por ejemplo:
n= 16, diferencia = 5
16 11 6 1 -4 1 6 11 16n= 10, diferencia = 5
10 5 0 5 10El código:
function pattern(number, dif, m = 0, nI = 0) { if (m === 2) { return 0; } var nI = nI !== 0 ? nI : number; if (!(m === 2)) { document.write(number + ' ') } if (number === 0 || number < 0) { pattern(number + dif, dif, 1, nI) } if (m === 0) { pattern(number - dif, dif, 0, nI) } if (m === 1) { if (nI == number) { pattern(false, false, 2, false) } pattern(number + dif, dif, 1, nI) } } pattern(10, 5)Básicamente, cuando el número está en 'n', vuelve a llamar a la función con el parámetro m = 2, se ejecuta el retorno pero ingresa en la suma:
if (m===1) { if (nI == number) { pattern(false, false, 2,false) } >>> pattern(number+dif, dif, 1,nI) <<<< }Su código se puede simplificar un poco. Cada vez que llama a una función foo() , el cuerpo de la función se ejecuta, y una vez que la función regresa/completa, el código continúa su ejecución desde la línea después de la llamada a la función foo() . Con esto en mente, su función recursiva puede simplificarse llamando a pattern() recursivamente mientras su number es positivo, y luego regresando (completando la función recursiva) para pasar la ejecución del código al código después de la llamada pattern() original:
function pattern(number,dif) { if(number <= 0) { document.write(number); } else { // If number > 0 document.write(number + ' '); pattern(number-dif, dif); document.write(' ' + number); } } pattern(16, 5);La idea es la siguiente: cuando encuentra un número positivo distinto de cero, lo imprime y luego vuelve a llamar al patrón, que luego imprime el número que se le dio, que luego vuelve a llamar al patrón, etc. hasta que finalmente llega a un número negativo/cero. . Cuando eso suceda, ya no tendrá más llamadas recursivas para realizar (vea el bloque if anterior), por lo que volvemos a la persona que llamó originalmente a nuestra función de patrón, que era la llamada recursiva anterior. Después de haber pasado el control de nuevo a la función de llamada, podemos imprimir de nuevo el número actual:
pattern() --> 16 | pattern() --> 11 | | pattern() --> 6 | | | pattern() --> 1 | | | | pattern() --> -4 (returns to above function, printing 1 again) | | | pattern() --> 1 | | pattern() --> 6 | pattern() --> 11 pattern() --> 16Crear una función de utilidad para acumular los valores en una matriz y luego unirlos y registrarlos (en lugar de que la función realice el registro) es más limpio en mi opinión:
function pattern(number, dif) { return number <= 0 ? [number] : [number, ...pattern(number-dif, dif), number]; } const patternArr = pattern(16, 5); document.body.textContent = patternArr.join(' ');Todas sus llamadas recursivas de pattern deben usarse con return . De lo contrario, seguirá yendo más profundo.
function pattern(number,dif,m=0, nI=0) { if (m===2) { return 0; } var nI = nI !== 0 ? nI : number; if (!(m===2)) { document.write(number+' ') } if (number=== 0 || number < 0){ return pattern(number+dif, dif, 1,nI) } if (m===0) { return pattern(number-dif, dif, 0,nI) } if (m===1) { if (nI == number) { return pattern(false, false, 2,false) } return pattern(number+dif, dif, 1,nI) } } pattern(10,5)