当我在python导师邮件列表上遇到一个我感兴趣的查询时,我一直试图理解递归函数。
作为一般性问题,我试图了解函数在返回值之前如何调用自身?这个功能如何"知道该怎么做" (即返回的值)如果它在正文结束之前调用自身(如果不存在return语句,则为隐式返回None)。
关于具体问题,我注意到这个电子邮件主题有以下功能(我已经修改过)但是我遇到了一些问题。
def perms(items):
""" Recursive function that uses a generator object
to compute all permutations of a given set of strings """
## CALL: list(perms("abc"))
boolarr = [(i == items[0]) for i in items if (len(items) > 1)]
if False not in boolarr:
print "%s" %("no permutations exist")
yield items
elif not items:
yield []
elif (len(items) == 1):
yield items[0]
else:
for i in range(len(items)):
## find permutations of everything except items[i]
for j in perms(items[:i] + items[(i+1):]):
## add items[i] to each of those permutations
yield items[i] + j
return
当我从解释器中将此函数称为列表(perms(" abc"))时,我得到以下输出:
no permutations exist
no permutations exist
no permutations exist
no permutations exist
no permutations exist
no permutations exist
Out[477]: ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
我在第一行写了布尔数组,为具有相同字符的字符串创建一个True值数组,例如: [" a"," a"," a']返回[" True"," True",&# 34;真"那么为什么它会在第一个值之后用False值填充它来评估列表(" abc"),这个值是构造为True。我在解释器上对此进行了测试,发现它有效。
另外,为什么它多次打印字符串就像它是循环的一部分一样?如果用户输入的序列长于2个字符并且它不是由所有相同的字符组成,那么函数的写入方式应该只进入嵌套迭代。如果我在身体的第一个条件之后评论打印线功能有效,我就不明白为什么。
非常感谢。