Si termina, lo que no estaría bien es que -10 factorial devolvería 1 cuando
el factorial de -10 no esta definido,según recuerdo, matemáticamente.
Lo único que tiene mal el método (por si querés probarlo) de Diego es el
punto al final del ifTrue: []

Saludos,
Facundo

2010/9/15 Guillermo Schwarz <[email protected]>

> Off topic, pero tu algoritmo no termina si se le pasa un número
> negativo...
>
> factorial
>        "Returns the factorial of the receiver."
>
>        ^self <= 0
>                ifTrue: [1].
>                ifFalse: [self * (self - 1) factorial].
>
> Para comparar las soluciones en distintos lenguajes habría que hacer un
> benchmark. Esos benchmarks existen, no veo la razón para hacerlos de nuevo
> acá. Gana SML siempre.
>
> Una de las optimizaciones que hacen los compiladores se llama tail
> recursion elimination y consiste en que la llamada recursiva final se
> reemplaza por un goto al principio del método.
>
> ¿Porqué sería tan importante la velocidad en RAM?
>
> En la práctica la velocidad de acceso a disco lo domina todo. Un disco más
> rápido hace toda la diferencia y hasta el momento los SSD son los más
> rápidos.
>
> Saludos,
> Guillermo.
>
>
>
> On Mon, 2010-09-13 at 06:45 -0700, [email protected] wrote:
> > Hay varias implementaciones de factorial, pero la que haría un
> > Smalltalker, al menos inicialmente, sería:
> >
> > factorial
> >       "Returns the factorial of the receiver."
> >
> >       ^self = 0
> >               ifTrue: [1].
> >               ifFalse: [self * (self - 1) factorial].
> >
> > Esta implementación, con mucho por mejorar sigue siendo rápida y
> > "esconde" cosas que en otros lenguajes son evidentes y complejas. Como
> > decías el GC es importante , otra cosa es el operador "*", que podría
> > ejecutarse en distintas clases según el tamaño del receptor, gracias
> > el carácter dinámico de Smalltalk y a que los números son objetos.
> > Quienes además conocen la implementación interna de Smalltalk, como
> > vos, tal vez puedan agregar muchos detalles de la implementación de
> > todo esto. Pero tal vez, lo que hace rápido en Smalltalk, es que un
> > ignorante (como yo) puede hacer algo rápido y de forma muy natural y
> > obvia.
> >
> > Yo pondría el esfuerzo por hacer algo rápido como parte de la
> > comparación entre lenguajes. Porque hay esfuerzos que son
> > impracticables, entonces en la práctica no se hacen y terminan como
> > sistemas lentos en C/C++. Cargar una librería C solo sirve para lo ya
> > resuelto, sería bueno saber cuánto esfuerzo requiere hacer esa
> > librería C (en Smaltalk escribir #factorial llevaría 2 líneas si no
> > estuviera hecho).
> >
> > Diego Coronel
> >
> > On Sep 10, 8:24 pm, Andres Valloud <[email protected]> wrote:
> > > En general menciono a JP Morgan porque trabaje ahi, pero Cincom tiene
> > > pila de bancos de clientes...
> > >
> > > Calcular 10000 factorial simplemente mide
> > >
> > > a) la velocidad de la primitiva que multiplica large integers (que en
> > > general se implementa con el algoritmo simple de la primaria porque es
> > > rapido para numeros chicos, asi que cuando se usa con numeros
> > > gigantescos entonces no es tan bueno, ver por ejemplohttp://
> blogten.blogspot.com/2008/07/mr-karatsuba.htmly similares),
> > >
> > > b) la velocidad de la implementacion de factorial, que en general es
> > > algo asi como
> > >
> > > | answer |
> > > self < 0 ifTrue: [self error].
> > > self < 2 ifTrue: [^1].
> > > answer := 1.
> > > 2 to: self do: [:each | answer := answer * each].
> > > ^answer
> > >
> > > y que en general es mas o menos la peor manera posible de implementar
> > > factorial para argumentos grandes.  Por ejemplo, es muchisimo usar la
> > > propiedad asociativa recursivamente y calcular
> > >
> > > (1*2) * (3*4) * ... (9999 * 10000)
> > >
> > > y luego
> > >
> > > ((1*2) * (3*4)) * ((5*6) * (7*8)) * ...
> > >
> > > y asi hasta llegar al resultado.  Pero eso no se dice...
> > >
> > > c) calcular 10000 factorial en C?... vas a necesitar GMP, pero esa es
> > > una libreria dedicada a numeros grandes, en vez de un lenguaje pensado
> > > para uso general sin objetivos demasiado especificos.  Por algo GMP no
> > > viene standard en C.  Pero entonces no estamos comparando la misma
> > > cosa...
> > >
> > > d) ademas, en Smalltalk vas a tener que incluir la comparacion del
> > > garbage collect de los resultados intermedios contra el garbage
> > > collect (manual o automatico) de los resultados intermedios en otro
> > > lenguaje... no es tan facil comparar.
> > >
> > > Andres.
> > >
> > > 2010/9/10 [email protected] <[email protected]>:
> > >
> > >
> > >
> > > > Gabriel,
> > > > Disculpame si lo dije mal, el punto es que siempre parece que se
> apela
> > > > a JPMorgan para mostrar que Smalltalk se usa (yo lo hago a veces). Y
> > > > como he hecho sistemas para bancos en Smalltalk, Java y Visual Basic,
> > > > no me termina de convencer como argumento válido. Mucho mas cuando la
> > > > estrella de los sistemas bancarios suele ser Cobol, y a buena honra.
> > > > Igual puede que tengas razón en este punto.
> > >
> > > > Respecto a la lentitud no estoy de acuerdo, creo que es un tema de
> > > > definir qué es velocidad. Si velocidad es cronometraer un loop,
> > > > entonces lo mas rápido es agarrar una pila y conectar un cable entre
> > > > los polos. Pero de qué sirven los test sobre torres de hanoi? son
> > > > útiles para cosas muy básicas, pero con un mínimo de complejidad (muy
> > > > poco) se hace inútil la velocidad de ejecución de instrucciones y
> > > > pasan a ser mucho mas importantes otras cosas, como la administración
> > > > de memoria por ejemplo. Y con un poquitito mas de complejidad pasan a
> > > > ser mas importantes la capacidad de abstracción y lidiar con la
> > > > complejidad. Y digo mas importantes desde el punto de vista de
> > > > velocidad. Evaluar 10000 factorial es una prueba de todo eso (es la
> > > > prueba de Smalltalk que mas me gusta).
> > >
> > > > Yo tengo un sistema de inteligencia de negocios por ejemplo, que hace
> > > > cosas muchisimo mas rápido que cualquier base de datos programadas en
> > > > C. Y son cosas que solo puedo hacer en Smalltalk, en cualquier otra
> > > > cosa serían impracticables. Saludos.
> > >
> > > > Diego
> > >
> > > > On Sep 10, 3:46 pm, Gabriel Brunstein <[email protected]> wrote:
> > > >> Diego, yo fui el que di esos ejemplos, porque me pareció adecuado
> decir que
> > > >> en la empresa en donde trabajo hacemos software para esos bancos que
> son
> > > >> importantes. Lo dije como ejemplo de software complejos y "serios",
> ya que
> > > >> alguien ahí opinaba que en Smalltalk no se puede hacer algo así.
> > > >> Con respecto a la lentitud, que acaso hay que mentir? Smalltalk
> suele
> > > >> consumir más recursos que C++ por ejemplo, lo que hay que ver es
> cuando es
> > > >> crítico ese factor y cuando no...
> > > >> Igualmente son solo opiniones.
> > > >> Saludos.
> > >
> > > >> 2010/9/10 [email protected] <[email protected]>
> > >
> > > >> > Hay que reconocer que el tipo ese que habla mal de Smalltalk
> conoce
> > > >> > algo, sabe lo que es VisualWorks o Seaside. Yo no sabría ni a qué
> > > >> > compilador de C o Java pegarle hoy en día. Lo mas típico de esos
> foros
> > > >> > es ver como los amantes de Smalltalk lo entierran diciendo que es
> > > >> > lento o que lo usa tal o cual banco. También coincido que con
> > > >> > Smalltalk no se puede hacer nada serio, y supongo que es el motivo
> por
> > > >> > el que estoy en esto.
> > >
> > > >> > Diego
> > >
> > > >> > On Sep 10, 2:14 pm, Jose Gregoris <[email protected]>
> wrote:
> > > >> > > da la cara vengador enmascarado aahhahah
> > >
> > > >> > > --- El vie 10-sep-10, Jose Gregoris <[email protected]>
> escribió:
> > >
> > > >> > > De: Jose Gregoris <[email protected]>
> > > >> > > Asunto: Re: [clubSmalltalk] Smalltalk en ADVA
> > > >> > > Para: [email protected]
> > > >> > > Fecha: viernes, 10 de septiembre de 2010, 16:03
> > >
> > > >> > > Hola gente , Esteban
> > >
> > > >> > > no se pierdan los últimos comentarios ahahahha
> > > >> > >  es para descostillarse ahahahah. Alguien que usa ST contesto
>  al estilo
> > > >> > diego y es genial ahhahahah.
> > > >> > > Hace rato no me reía así ahahhahha
> > >
> > > >> > > saludos
> > >
> > > >> > > --- El vie 10-sep-10, Esteban A. Maringolo <
> [email protected]>
> > > >> > escribió:
> > >
> > > >> > > De: Esteban A. Maringolo <[email protected]>
> > > >> > > Asunto: Re: [clubSmalltalk] Smalltalk en ADVA
> > > >> > > Para: [email protected]
> > > >> > > Fecha: viernes, 10 de septiembre de 2010, 14:25
> > >
> > > >> > > Kiko:
> > >
> > > >> > > No te gastes... cada cual tiene con qué programar a su gusto.
> > > >> > > Por suerte existe Smalltalk.
> > >
> > > >> > > Saludos!
> > >
> > > >> > > Esteban A. Maringolo
> > >
> > > >> > > --
> > > >> > > To post to this group, send
> > > >> > >  email to [email protected]
> > > >> > > To unsubscribe from this group, send email to
> > > >> > [email protected]<clubsmalltalk%[email protected]>
> <clubsmalltalk%2bunsubscr...@goog­­legroups.com>
> > >
> > > >> > >http://www.clubSmalltalk.org
> > >
> > > >> > > --
> > >
> > > >> > > To post to this group, send email to
> [email protected]
> > >
> > > >> > > To unsubscribe from this group, send email to
> > > >> > [email protected]<clubsmalltalk%[email protected]>
> <clubsmalltalk%2bunsubscr...@goog­­legroups.com>
> > >
> > > >> > >http://www.clubSmalltalk.org
> > >
> > > >> > --
> > > >> > To post to this group, send email to
> [email protected]
> > > >> > To unsubscribe from this group, send email to
> > > >> > [email protected]<clubsmalltalk%[email protected]>
> <clubsmalltalk%2bunsubscr...@goog­­legroups.com>
> > >
> > > >> >http://www.clubSmalltalk.org-Hide quoted text -
> > >
> > > >> - Show quoted text -
> > >
> > > > --
> > > > To post to this group, send email to [email protected]
> > > > To unsubscribe from this group, send email to
> [email protected]<clubsmalltalk%[email protected]>
> > >
> > > >http://www.clubSmalltalk.org- Hide quoted text -
> > >
> > > - Show quoted text -
> >
> > --
> > To post to this group, send email to [email protected]
> > To unsubscribe from this group, send email to
> [email protected]<clubsmalltalk%[email protected]>
> >
> > http://www.clubSmalltalk.org
>
> --
> Simplex Veri Sigillum
>
> --
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]<clubsmalltalk%[email protected]>
>
> http://www.clubSmalltalk.org
>

-- 
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]

http://www.clubSmalltalk.org

Responder a