Solving the problem of mutual recursion

Jussi Piitulainen jpiitula at ling.helsinki.fi
Sun May 26 11:09:27 EDT 2013


Peter Brooks writes:

> I'm not sure if this'll interest anybody, but I expect that I'm
> going to get some mutual recursion in my simulation, so I needed to
...
> returned, then this solution won't help you. Often, though, you're
> not interested in what's returned and would just like the routine to
> exit once it's called itself, or another process, recursively.
> 
> If that's the case, this solution, using threads, allows you to have
> functions call themselves, or each other, indefinitely. It works OK
> on a macbook pro and the thread count varies from 2-3, so it handles

... hard to resist ... but somehow I manage ... whew ...

A light-weighter way is to have each task end by assigning the next
task and returning, instead of calling the next task directly. When a
task returns, a driver loop will call the assigned task, which again
does a bounded amount of work, assigns the next task, and returns.
Tasks can even pass parameters in the same way.

Like so, Dr. Fred keeps adding to a pile as long as there is a pile,
and Mr. Jim keeps taking from it as long as it's there to take from:

from random import choice

def fred():
    global fun, arg
    print('Fred adds 1')
    fun, arg = choice((fred, jim)), arg + 1

def jim():
    global fun, arg
    print('Jim takes 1')
    fun, arg = choice((fred, jim)), arg - 1

if __name__ == '__main__':
    fun, arg = choice((fred, jim)), 3
    while arg:
        print('Pile is', arg, end = '\t')
        fun()
    else:
        print('Pile is gone')



More information about the Python-list mailing list