Python 中的递归定义
Recursive definitions in Python
我刚 运行 进入 the following way of implementing AutoVivification 在 Python:
from collections import defaultdict
Tree = lambda: defaultdict(Tree)
# common name by class, order, genus, and type-species
common_name = Tree()
common_name['Mammalia']['Primates']['Homo']['H. sapiens'] = 'human being'
下面的构造是如何工作的?
Tree = lambda: defaultdict(Tree)
Tree
好像没有在lambda函数体之前定义,也没有作为参数传递。
lambda 函数的主体如何在定义之前知道 Tree
?该语言还支持哪些其他类型的递归定义?
这就是像 python 这样的动态语言的伟大之处 -- Tree
是 在您调用它时定义的。它实际上与任何其他递归函数没有什么不同...
例如你可能不会眨眼看到这个:
def recurse(i):
if i > 0:
recurse(i-1)
之所以有效,是因为 python 创建了递归函数。然后当你调用它时,python 在到达该行时查找递归函数并调用它并...
在这种情况下,它确实没有太大区别 -- 您的 lambda 可以这样写(也许更清楚):
def Tree():
return defaultdict(Tree)
相当于:
def Tree():
return defaultdict(Tree)
函数的内容不会立即求值,只有在它被调用时才会求值,此时它可以知道关于Tree
。这就是递归函数可以工作的原因。
我刚 运行 进入 the following way of implementing AutoVivification 在 Python:
from collections import defaultdict
Tree = lambda: defaultdict(Tree)
# common name by class, order, genus, and type-species
common_name = Tree()
common_name['Mammalia']['Primates']['Homo']['H. sapiens'] = 'human being'
下面的构造是如何工作的?
Tree = lambda: defaultdict(Tree)
Tree
好像没有在lambda函数体之前定义,也没有作为参数传递。
lambda 函数的主体如何在定义之前知道 Tree
?该语言还支持哪些其他类型的递归定义?
这就是像 python 这样的动态语言的伟大之处 -- Tree
是 在您调用它时定义的。它实际上与任何其他递归函数没有什么不同...
例如你可能不会眨眼看到这个:
def recurse(i):
if i > 0:
recurse(i-1)
之所以有效,是因为 python 创建了递归函数。然后当你调用它时,python 在到达该行时查找递归函数并调用它并...
在这种情况下,它确实没有太大区别 -- 您的 lambda 可以这样写(也许更清楚):
def Tree():
return defaultdict(Tree)
相当于:
def Tree():
return defaultdict(Tree)
函数的内容不会立即求值,只有在它被调用时才会求值,此时它可以知道关于Tree
。这就是递归函数可以工作的原因。