理解用于生成序列

时间:2016-02-28 21:58:06

标签: python recursion

当我在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个字符并且它不是由所有相同的字符组成,那么函数的写入方式应该只进入嵌套迭代。如果我在身体的第一个条件之后评论打印线功能有效,我就不明白为什么。

非常感谢。

0 个答案:

没有答案