oh, ok, I undestand now :-)... it is to show the limitations in Java.
> 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...)This is not something that can be done in Java, the language used for teaching OO in my university.
Having methods like #abs, #factorial, #+ defined on Integer is an excellent reason why we do not need a class java.util.Math.
These methods look natural to us, but they are not for other people.
I agree with you.
> For me is a good example of a recursive "function"
Because it is a natural distribution of responsibility, that cannot be easily done in Java or C#.
> 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?
Alexandre
--
> On Thu, Jun 16, 2011 at 9:52 AM, Alexandre Bergel <alexandre.bergel@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@10Pines.com
> site: http://www.10Pines.com
>
_,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
Alexandre Bergel �http://www.bergel.eu
^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.