[Pharo-project] Integer>>#factorial

Andres Valloud avalloud at smalltalk.comcastbiz.net
Sat Jun 18 15:36:57 EDT 2011


But unfortunately we do not have tail recursion (that I know)...

On 6/16/11 10:46 , Lorenzo Schiavina wrote:
> IMHO factorial is a good OO example because you have not the usual
> limitation of "traditional" languages and you can understand the OOP power.
> Try, for example 1000 factorial in ST and in other languages.
> Cheers
> Lorenzo
>
>     ----- Original Message -----
>     *From:* Hernan Wilkinson <mailto:hernan.wilkinson at 10pines.com>
>     *To:* Pharo-project at lists.gforge.inria.fr
>     <mailto:Pharo-project at lists.gforge.inria.fr>
>     *Sent:* Thursday, June 16, 2011 5:03 PM
>     *Subject:* Re: [Pharo-project] Integer>>#factorial
>
>     I agree with Alex, but I don't see why, alex, you say it is a good
>     example for teaching OO (the smalltalk factorial implementation...)
>     For me is a good example of a recursive "function"
>     I think it would be a good OO example it it was using "object
>     recursion" or the one that could be implemented in a prototyped
>     language... why do you think it is a good oo example the smalltalk
>     factorial implementation?
>
>     On Thu, Jun 16, 2011 at 9:52 AM, Alexandre Bergel
>     <alexandre.bergel at me.com <mailto:alexandre.bergel at me.com>> wrote:
>
>         Hi Sven,
>
>         I am not sure it should replace the standard implementation.
>         Integer>>factorial is essentially there for teaching purpose in
>         my opinion. I am not sure how often factorial is used in
>         practice. The most important for me is not it to be fast, but to
>         be an excellent example of OOP.
>
>         Your implementation could be next to the standard one though.
>
>         Cheers,
>         Alexandre
>
>
>         On 16 Jun 2011, at 06:38, Sven Van Caekenberghe wrote:
>
>          > Hi,
>          >
>          > On Planet Smalltalk I read about this challenge:
>         http://www.parcplace.net/list/vwnc-archive/1106/msg00080.html
>         the goal being to optimize the current, naive
>         Integer>>#factorial implementation.
>          >
>          > I had some old Lisp code hanging around, implementing an
>         algorithm that I once found somewhere, and I ported it to
>         Smalltalk. I am sure there are faster solutions, but this one is
>         twice as fast as the original while still being easy to
>         understand and it has a useful, safe helper method:
>          >
>          > Integer>>#svcFactorial
>          > "Answer the factorial of the receiver."
>          >
>          > self = 0 ifTrue: [ ^ 1 ].
>          > self > 0 ifTrue: [ ^ 1 productUpTo: self ].
>          > self error: 'Not valid for negative integers'
>          >
>          > Integer>>#productUpTo: anInteger
>          > "Answer the product of all integers from the receiver
>         (non-inclusive) up to anInteger (inclusive)."
>          >
>          > | difference split |
>          > self assert: (self between: 0 and: anInteger).
>          > "the idea is to multiply LargePositiveIntegers of
>         approximately the same size"
>          > difference := anInteger - self.
>          > difference = 0 ifTrue: [ ^ 1 ].
>          > difference = 1 ifTrue: [ ^ anInteger ].
>          > difference = 2 ifTrue: [ ^ (anInteger - 1) * anInteger ].
>          > difference = 3 ifTrue: [ ^ (anInteger - 2) * (anInteger - 1)
>         * anInteger ].
>          > difference = 4 ifTrue: [ ^ (anInteger - 3) * (anInteger - 2)
>         * (anInteger - 1) * anInteger ].
>          > split := (self + anInteger) bitShift: -1.
>          > ^ (self productUpTo: split) * (split productUpTo: anInteger)
>          >
>          > Would it be a good idea to replace the current implementation
>         with this one ?
>          >
>          > Sven
>          >
>          >
>
>         --
>         _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
>         Alexandre Bergel http://www.bergel.eu
>         ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
>
>
>
>
>
>
>
>
>
>     --
>     *Hernán Wilkinson
>     Agile Software Development, Teaching & Coaching
>     Mobile: +54 - 911 - 4470 - 7207
>     email: hernan.wilkinson at 10Pines.com
>     site: http://www.10Pines.com <http://www.10pines.com/>*
>




More information about the Pharo-dev mailing list