Python is not bad ;-)

Cecil Westerhof Cecil at decebal.nl
Sat May 2 07:12:18 EDT 2015


Op Saturday 2 May 2015 12:35 CEST schreef Dave Angel:

> On 05/02/2015 05:33 AM, Cecil Westerhof wrote:
>
> Please check your email settings. Your messages that you type seem
> to be indented properly, but those that are quoting earlier messages
> (even your own) are not. See below. I suspect there's some problem
> with how your email program processes html messages.
>
>> Op Saturday 2 May 2015 10:26 CEST schreef Cecil Westerhof:
>>>
>>> That is mostly because the tail recursion version starts
>>> multiplying at the high end. I wrote a second version: def
>>> factorial_tail_recursion2(x): y = 1 z = 1 while True: if x == z:
>>> return y y *= z z += 1
>>>
>>> This has almost the performance of the iterative version: 34 and
>>> 121 seconds.
>>>
>>> So I made a new recursive version:
>>> def factorial_recursive(x, y = 1, z = 1):
>>> return y if x == z else factorial_recursive(x, x * y, z + 1)
>>
>> Stupid me 'x == z' should be 'z > x'
>>
>
> I can't see how that is worth doing. The recursive version is
> already a distortion of the definition of factorial that I learned.
> And to force it to be recursive and also contort it so it does the
> operations in the same order as the iterative version, just to gain
> performance?
>
> If you want performance on factorial, write it iteratively, in as
> straightforward a way as possible. Or just call the library
> function.
>
> Recursion is a very useful tool in a developer's toolbox. But the
> only reason I would use it for factorial is to provide a simple
> demonstration to introduce the concept to a beginner.

And that was what I was doing here: showing that tail recursion can
have benefits.

By the way I have seen factorial mostly implemented recursive.

Also I am now testing with very large values. The version where I use
both tail recursion versions are faster as the iterative version.
Calculating 500.000:
iterative:                  137 seconds
tail recursion optimised:   120 seconds
tail recursion simple:      130 seconds

You have to be careful that you do not fall into the trap that you are
sure your way is the best way. I have had the same on the Scala list.
I told there that for a certain function it was better to use an
iterative version as a tail recursive function. They did not want to
believe it at first.

-- 
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof



More information about the Python-list mailing list