Está bueno eso, incluso serái interesante jugar con clases como Cero o Uno, asi como hacemos con True y False. El método que escribí sería mas lindo. Nos sacaríamos IFs por todos lados (y supongo que nos ganaríamos otros problemas)
On Sep 15, 9:22 am, Facundo Vozzi <[email protected]> wrote: > Sí, estoy de acuerdo en lo que decís. Solo quería poner que el método si > "terminaba" para los negativos. Después que pasa con el factorial de un > negativo es discutible porque no está definido matematicamente así que > podría devolver 1 o tirar una excepción. También si tuvieramos modelados los > Naturales más el cero podrías implementar el método solo ahí. > > Otro saludo. > > 2010/9/15 [email protected] <[email protected]> > > > > > Facundo, > > Tenés razón, pero tal vez lo que hice peor fue escribir código > > Smalltalk fuera de Smalltalk (en un mail) dando a entender de que era > > un algortímo cuando no lo es. No solo porque Smalltalk me hubiese > > avisado de ese punto que decis, sino porque no considero el ambiente, > > que es lo mas importante. Y no alcanzaría con especificar la clase del > > método, debería especificar todos los métodos y clases del ambiente, > > los objetos instanciados, todo... y seguiría sin alcanzar porque es un > > ambiente. Lo digo desde el punto de vista práctico (creo filosofía en > > esto). > > Respecto a los negativos, mas allá de la definición matemática, > > remarco que los métodos no siempre se pueden enviar a todos los > > objetos posibles del dominio de una clase. En general los métodos no > > resuelven todo lo que un receptor de esa clase puede devolver, y sería > > un error hacer programación defensiva con eso. Asi como no se le puede > > enviar #copyFrom: 5 a cualquier String, ni #new a cualquier clase, ni > > #arcCos a cualquier Float. La responsabilidad en el envió de un > > mensaje está del lado del emisor y no del receptor o método que lo > > resuelve. > > > Saludos, > > Diego > > > On Sep 15, 6:44 am, Facundo Vozzi <[email protected]> wrote: > > > 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 > > Coronelbegin_of_the_skype_highlighting end_of_the_skype_highlighting > > > > > > 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. > > ... > > read more »- 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] http://www.clubSmalltalk.org
