[Python-ideas] A Continuations Compromise in Python
MRAB
google at mrabarnett.plus.com
Tue May 5 14:18:07 CEST 2009
Jacob Holm wrote:
> Aahz wrote:
>> On Mon, May 04, 2009, John Graham wrote:
>>> I do have a question though, if recursive algorithms are generally
>>> frowned upon (and I'd say, without TCO, anything too complex hits the
>>> stack quick) why is recursion even supported? What is the 'Pythonic'
>>> use of recursion?
>>
>> Who has said that recursive algorithms are "generally" frowned upon?
>> What people have said is that Python is not focused on recursive
>> algorithms the way TCO-languages are, but that is also true of e.g.
>> functional programming style.
>
> An unfortunate result of "Python is not focused on recursive algorithms"
> is that such algorithms become much harder to work with. Yes, there is
> always a way to write it without recursion, and often the non-recursive
> version will run faster because of the slow function calls. However,
> the non-recursive version is usually much less readable/maintainable,
> which is really a shame in a language designed for readability.
>
>
>> Recursive algorithms are natural for
>> nested datastructures, but you will almost never find a nested
>> datastructure that is a thousand levels deep.
>
> Balanced trees are not the only data structures in the world.
>
> Depth-first traversal of a graph is most easily expressed using
> recursion, and graphs with thousands (or even millions) of vertices are
> not uncommon.
>
> Also, there are many other types of problems where a recursive algorithm
> is the most natural. Most discrete optimization problems fall in this
> category. For toy examples, look at almost any type of puzzle-solving.
>
>
> The proposed "continue <functioncall>" feature doesn't help these cases,
> because they don't use tail calls. For that you need something like
> Stackless. I'm -1 on the spelling anyway because it would kill the idea
> of using "continue <expression>" in a for-loop as a way to send the
> value of <expression> to the generator being iterated over.
>
> I'm +0 on the idea of using syntax to explicitly request tail call
> optimization.
>
> I'm +1 on doing implicit tail-call optimization, even if it does make
> the stack trace less useful.
>
Could Python implement tail recursion optimisation and somehow 'fake'
the stack trace? I'm thinking that the stack trace would contain a
repeating pattern of calls, so it would store and show the pattern of
calls and the count of how many times the sequence was repeated.
More information about the Python-ideas
mailing list