elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  funcion coseno
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: funcion coseno  (Leído 6,379 veces)
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: funcion coseno
« Respuesta #10 en: 21 Abril 2019, 09:46 am »

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):

Código:
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).
Código:
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...
Código:
     ...
     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...


« Última modificación: 22 Abril 2019, 15:46 pm por NEBIRE » En línea

Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: funcion coseno
« Respuesta #11 en: 22 Abril 2019, 04:18 am »

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

Código
  1. int factorial(int n)
  2. {
  3. if(n<2)
  4. return 1;
  5. else
  6. return n*factorial(n-1);
  7. }


En línea

7w7
CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: funcion coseno
« Respuesta #12 en: 22 Abril 2019, 15:14 pm »

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

n = n + (n * k)

La suma parece estar demas.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: funcion coseno
« Respuesta #13 en: 22 Abril 2019, 15:38 pm »

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.
En línea

Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: funcion coseno
« Respuesta #14 en: 22 Abril 2019, 16:17 pm »

 :laugh:
En línea

7w7
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines