esto es lo que tengo
let base = 10000 let yearly = 31557600 let apy = 0.09 let loop = 0; let new_base = '0'; function recurse(base){ new_base = base*(1+apy*1/(yearly)); if(loop < 3600){ loop++; return recurse(new_base); } else { return new_base; } } base = recurse(base); console.log(base);si cambio 3600 por un número muy grande, aparece el error: se excedió el tamaño máximo de la pila de llamadas
Esto me parece normal porque la operación recursiva se ejecuta demasiadas veces,
cual seria la solucion ¿Es posible transformar la función recursiva en una función lineal, por ejemplo?
Gracias
Bueno, se puede transformar en una ecuación, pero no en una lineal.
Aquí está el enfoque:
Cambiaré el nombre de la base como b0, y la nueva base como b1
b1 = b0 * (1 + (apy/anual)
y después de que se incremente el bucle, se actualizará la nueva base, llamemos al nuevo b1 como b2:
b2 = b1 * (1 + (apy/anual))
b2 = b0 * (1 + (apy/anual))^2
y así..
por lo que el valor final devuelto será:
base * (1 + (apy/anual))^3600
y la fórmula general será
base * (1 + (apy/anual))^n, donde n es 3600 en su caso.
Poniendo las constantes enchufadas obtendrás 10,000.102669931423184360664719158
Recuerde votar esta respuesta si resuelve su problema.
¿Necesita recursividad? No.
function recurse2(base){ new_base = base*(1+apy*1/(yearly)); for(loop = 1; loop < 100; loop++){ new_base = base*(1+apy*1/(yearly)); } return new_base; }Ni siquiera sigues la optimización. Este es solo un valor que está siendo mutado una y otra vez. No necesita un nuevo marco de pila (llamada a función) para mutar dicho valor, simplemente recorra sobre él.
¿Cómo llegué a esta función? Solo piense qué le sucede a la base cuando la pasa y cómo cambia con cada "recursión". Simplemente se multiplica por alguna expresión cada vez. Así que podemos hacer eso en un bucle.
Incluso puedes mejorar el fragmento de código que tengo aquí con do {} while();
La siguiente captura de pantalla muestra pruebas rápidas que muestran que la función recurse2 que escribí es idéntica*. 