简单而微小的基于产量的蹦床实现。
trampoline的Python项目详细描述
从简单递归转换
蹦床函数是生成器:而不是递归到其他函数中 它们直接产生要递归到的调用的生成器。这个 第一个调用的生成器使用 trampoline() 函数调用。
这是最容易理解的一个例子。 考虑这个简单的递归函数:
>>> def print_numbers(n): ... "Print numbers 0..n (recursive)." ... if n >= 0: ... print_numbers(n - 1) ... print(n) >>> >>> print_numbers(2000) # doctest: +IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): RecursionError: maximum recursion depth exceeded in comparison
如果调用堆栈的值太大,则会耗尽堆栈。 与我们的蹦床版本相比:
>>> from trampoline import trampoline >>> >>> def print_numbers(n): ... "Print numbers 0..n (trampolined)." ... if n >= 0: ... yield print_numbers(n - 1) ... print(n) >>> >>> trampoline(print_numbers(2000)) # doctest: +ELLIPSIS 0 1 2 ... 1999 2000
我们向递归调用添加了一个 yield 语句,并包装了函数 用蹦床调用
蹦床 接收由 打印号码(2000)调用创建的生成器并运行它。 然后,生成器生成另一个 print_numbers 生成器,然后 接管,有效地递归到其中。
当生成器返回时,产生的生成器将再次接管。
当然,蹦床函数不必调用自己。任何其他 蹦床函数发生器可以。