简单而微小的基于产量的蹦床实现。

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 生成器,然后 接管,有效地递归到其中。

当生成器返回时,产生的生成器将再次接管。

当然,蹦床函数不必调用自己。任何其他 蹦床函数发生器可以。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Maven中的java,为什么要运行“mvn clean”?   java会降低图像质量。OutOfMemory异常Android   在Java8中将函数传递到流的过滤方法   jboss6。x java。lang.NoClassDefFoundError,当我将<listenerclass>包含到web时。xml java   java读取图像像素时,像素Alpha始终为255   java在迭代后跳过一行   java如何创建我自己的单链表   意图上的java空指针异常。getStringExtra.:安卓   具有连接实体的java Hibernate onetoone映射   java需要帮助在自制的仓鼠模拟器上实现启动/恢复/暂停/停止线程操作   如何测试非主方法?[Java,IntelliJ]   java jdbc自动提交(false)不起作用   java在JADE中的同一容器中创建多个代理   java OkHttp获取失败的响应正文   java Webdriver flash按钮