Python 理解生成序列置换的递归函数

Python 理解生成序列置换的递归函数,python,recursion,Python,Recursion,当我在python导师邮件列表上遇到一个我觉得有趣的查询时,我一直在尝试了解递归函数 作为一个一般性问题,我试图理解函数如何在返回值之前调用自身?如果函数在主体结尾之前调用自身(如果不存在return语句,则为隐式return None),该函数如何“知道要做什么”(即返回什么值) 关于具体的问题,我注意到这个电子邮件线程有以下功能(我已经修改过),但是有一些问题 def perms(items): """ Recursive function that uses a generator

当我在python导师邮件列表上遇到一个我觉得有趣的查询时,我一直在尝试了解递归函数

作为一个一般性问题,我试图理解函数如何在返回值之前调用自身?如果函数在主体结尾之前调用自身(如果不存在return语句,则为隐式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
当我从解释器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语句不是或多或少做了打印应该做的事情吗?还是我误解了你?不,一点也不。打印会对你有所帮助了解哪些行是按什么顺序执行的。请在发布前搜索。在这个论坛上有很多问题都有很好的答案,这些问题解释了递归函数是如何操作的。其中一些问题处理的正是置换的应用。