funcion coseno

Iniciado por Beginner Web, 28 Marzo 2019, 04:11 AM

0 Miembros y 1 Visitante están viendo este tema.

Serapis

#10
Deberías aprender a pasar llamadas recursivas a iterativas y viceversa (el viceversa suele ser la mayoría de las veces más sencillo).

Así sería calcular el factorial en un simple bucle (es decir pasado a iterativo):


j = 10   // factorial entre 1 y 10
n = 1
bucle para k desde 2 a j  // si 'j' fuere 0, ó 1 todavía arrojará el valor correcto con n = 1
   n =  (n * k)
fin bucle


Ahora bien, dado que estás usando el factorial dentro de un bucle, vas a calcular innumerables veces el factorial de un número, incluso muchas veces podría ser el mismo valor, más aún, si luego la función que usa dicho bucle es llamada múltiples veces, resultará que estás ejecutando casi todo el tiempo el factorial de un número en vez de hacer otras cosas...

...en tales situaciones es mejor pre-calcular una úncia vez el factorial para cada número hasta el máximo, y guardarlo en un array, así luego basta tomar el iésimo valor del array.

Si la función se llamara una única vez, bastaría precalcularlo al entrar en la propia función, pero si la función fuere invocada múltiples veces entonces es mejor precalcularla al inicializar el componente de código del que forma parte.

Nótese que con apenas el factorial de 16 ya arroja: 20.922.789.888.000, es decir algo más de 2^44... así que el array tendrá un tamaño relativamente pequeño. es decir consumirá muy poca memoria, tan poca que incluso los lenguajes podrían tenerlo como constantes (para 32 bits, basta llegar hasta el factorial de 12).

array de int factoriales()  // en realidad dimensionar el array al número de indices que deba contener como máximo...
funcion PrecalcularFactorial(int x)
   int k, n  

   n = 1
   factoriales(0) = n  
   factoriales(1) = n  
   bucle para k desde 2 a x
       n = (n * k)
       factoriales(k) = n  
   fin bucle
fin funcion


Ahora cuando tengas que usarlo...en vez de ser una llamada a una función o una ejecución en un bucle, será una dirección de memoria que ya contiene el valor...

    ...
    cos += pow(-1,exponente) * pow(x,i)/factoriales(i);
   ...

...con lo cual el tiempo invertido será únicamente el de acceso al array, que, comparado con la pérdida de tiempo de estar contínuamente recalculando el factorial, el ahorro en tiempo será notorio...

Beginner Web

Pero aun sigues haciendo una llamada adicional  :laugh:  ;-)

Código (cpp) [Seleccionar]
int factorial(int n)
{
if(n<2)
return 1;
else
return n*factorial(n-1);
}
7w7

CalgaryCorpus

El reemplazo de la recursion por la version iterativa no parece estar calculando el factorial.

n = n + (n * k)

La suma parece estar demas.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Serapis

Cierto, un lapsus mental... Gracias CalgaryCorpus, lo corrijo

Ana, tu comentario precedente ya lo esgrimiste anteriormente a una respuesta previa que te dieron, pero ahora no procede.

Beginner Web

7w7