Com programação dinâmica, independente de linguagem de programação, é
possível calcular o fatorial rapidamente. No entanto, um tradeoff em
ciência da computação é justamente desempenho x consumo de memória. Em
C, por exemplo, não é difícil programar um tipo de dados de precisão
arbitrária. No livro Programming Challenges, informações
bibliográficas em
http://www.programming-challenges.com/pg.php?page=index), tem
explicando como fazer isso, acho que no capítulo 5. E linguagens e
ambientes de desenvolvimento atuais fornecem classes ou tipos de dados
com precisão arbitrária, como a classe BigInteger em Java.

Eu tenho mostrado como resolver o problema 3n+1 utilizando uma técnica
que pode ser utilizada para calcular o fatorial de números grandes.
Melhorou muito o desempenho para o problema 3n+1. Tem que ver como
adaptar ao cálculo do fatorial. Como posso disponibilizar o arquivo?
Posso simplesmente anexar e enviar para a lista? Vou tentar adicionar
em algum disco virtual e mandar o link.

Comecei a estudar lisp, mas meu tempo está muito dividido. Atualmente
progromo em Java, C, C++ e Prolog. Enviei a mensagem porque falava do
cálculo do fatorial. E eu lembrei que a técnica que utilizei para o
problema 3n+1 poderia ser utilizada para otimizar o cálculo do
fatorial. Se vocês acharem que o post está off-topic, ignorem ou
mandem um aviso.



Estou treinando uma equipe da Universidade

2009/4/30 Mario Domenech Goulart <[email protected]>:
>
> Alô pessoal.
>
> On Thu, 30 Apr 2009 00:36:22 -0700 (PDT) namekuseijin 
> <[email protected]> wrote:
>
>> Muito bom e exaustivo por sinal
>
> Passando os olhos rapidamente, não vi algumas possibilidades de cálculo
> de fatorial bem simples com Lisp (usando 10! nos exemplos e Chicken
> Scheme -- http://www.call-with-current-continuation.org).
>
> O fatorial de 10 é (* 10 9 8 7 6 5 4 3 2):
>
> $ cat eval-fact.scm
> #! /usr/bin/csi -s
>
> (use numbers srfi-1)
>
> (print (eval `(* . ,(iota 10 1))))
>
> $ ./eval-fact.scm
> 3628800
>
>
> Chicken possui uma limitação quanto ao número de argumentos que
> procedimentos podem receber (normalmente 1000).  Assim, para fatorial de
> números maiores que 1000 essa estratégia não funciona.  Mas pode-ser
> usar `reduce':
>
> $ cat reduce-fact.scm
> #!/usr/bin/csi -s
>
> (use numbers srfi-1)
>
> (print (reduce * '() (iota 10 1)))
>
>
> $ ./reduce-fact.scm
> 3628800
>
>
> Ou, ainda (apelando para a malandragem), fazendo parte do trabalho em
> tempo de compilação. :-)
>
> $ cat macro-fact.scm
> #!/usr/bin/csi -script
>
> (use numbers srfi-1)
>
> (define-macro (fact n)
>  `,(reduce * '() (iota n 1)))
>
> (print (fact 10))
>
> $ ./macro-fact.scm
> 3628800
>
>
> Um abraço.
> Mario
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lisp-br" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/lisp-br?hl=en
-~----------~----~----~----~------~----~------~--~---

Responder a