2009/4/30 Gilzamir Gomes <[email protected]> > > 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?
Você pode usar o http://paste.lisp.org/ . > > 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 -~----------~----~----~----~------~----~------~--~---
