Python 理解生成序列置换的递归函数
当我在python导师邮件列表上遇到一个我觉得有趣的查询时,我一直在尝试了解递归函数 作为一个一般性问题,我试图理解函数如何在返回值之前调用自身?如果函数在主体结尾之前调用自身(如果不存在return语句,则为隐式return None),该函数如何“知道要做什么”(即返回什么值) 关于具体的问题,我注意到这个电子邮件线程有以下功能(我已经修改过),但是有一些问题Python 理解生成序列置换的递归函数,python,recursion,Python,Recursion,当我在python导师邮件列表上遇到一个我觉得有趣的查询时,我一直在尝试了解递归函数 作为一个一般性问题,我试图理解函数如何在返回值之前调用自身?如果函数在主体结尾之前调用自身(如果不存在return语句,则为隐式return None),该函数如何“知道要做什么”(即返回什么值) 关于具体的问题,我注意到这个电子邮件线程有以下功能(我已经修改过),但是有一些问题 def perms(items): """ Recursive function that uses a generator
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
当我从解释器as list(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']
我已经在第一行编写了布尔数组,为具有相同字符的字符串创建了一个真值数组,例如,[“a”、“a”、“a']返回[“真”、“真”、“真”],那么为什么它要计算列表(“abc”)因此,在第一个值之后应该填充假值,通过构造,这是真的。我在解释器上测试了这一点,发现它可以工作
另外,为什么它要像循环的一部分一样多次打印字符串?函数的编写方式应该只在用户输入的序列长度超过2个字符并且不是由所有相同的字符组成时才转到嵌套迭代。如果我在正文中的第一个条件之后注释打印行函数起作用了,我只是不明白为什么
非常感谢。我想你对递归函数何时返回有点误解。试着放入一些打印语句,这可能有助于解决你的困惑。@Daniel:谢谢,yield语句不是或多或少做了打印应该做的事情吗?还是我误解了你?不,一点也不。打印会对你有所帮助了解哪些行是按什么顺序执行的。请在发布前搜索。在这个论坛上有很多问题都有很好的答案,这些问题解释了递归函数是如何操作的。其中一些问题处理的正是置换的应用。