Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能';“我不明白。”;“收益率”;在Python中使用递归函数_Python_Recursion - Fatal编程技术网

我能';“我不明白。”;“收益率”;在Python中使用递归函数

我能';“我不明白。”;“收益率”;在Python中使用递归函数,python,recursion,Python,Recursion,我试图理解“收益率” 首先,下面是我无法理解的代码 def permutations(seq): if len(seq) <= 1: yield seq else: for perm in permutations(seq[1:]): for i in range(len(perm)+1): yield perm[i:] + seq[0:1] + perm[:i] print list(permuta

我试图理解“收益率”

首先,下面是我无法理解的代码

def permutations(seq):
    if len(seq) <= 1: yield seq
    else:
        for perm in permutations(seq[1:]):
            for i in range(len(perm)+1):
                yield perm[i:] + seq[0:1] + perm[:i]

print list(permutations(['police', 'buffalo', 'fish']))
我对“产量”的理解是,它只是用来发电的。我能理解下面的代码

def reverse(data):
    for index in range(len(data) -1, -1, -1):
        yield data[index]

for char in reverse('golf'):
    print(char)

f
l
o
g

我的水平只是理解上面的。。但对于递归,我无法理解。。。请解释一下。谢谢

是的,产量是给发电机的。这意味着调用时,它们返回迭代器。生成器可以是递归的:它们将调用自己,得到一个迭代器并对其进行迭代,在每次迭代中,它们可以生成任意数量的自己的元素

在您的示例中,
permutations
是一个生成器,它总是在列表上返回迭代器

if len(seq) <= 1: yield seq
表示“现在迭代不同的列表序列”,在这种情况下,这是第一个列表之后元素的所有排列序列。在每次迭代中,我们都有一个嵌套循环,它将第一个元素插入置换的每个位置并产生结果

我希望这有帮助。这对我来说有点难,因为我不知道你到底对什么感到困惑

更新:OP想知道为什么第一个结果的顺序相反。考虑这条线:

yield perm[i:] + seq[0:1] + perm[:i]
对于第一个结果(i=0),这相当于
yield perm+seq[0:1]
——第一个元素被发送到生成列表的末尾。通过归纳,该结果与
seq
相反。如果您希望第一个结果是
['police'、'buffalo'、'fish']
,则可以执行以下操作:

yield perm[:i] + seq[0:1] + perm[i:]

是的,产量是用于发电机的。这意味着调用时,它们返回迭代器。生成器可以是递归的:它们将调用自己,得到一个迭代器并对其进行迭代,在每次迭代中,它们可以生成任意数量的自己的元素

在您的示例中,
permutations
是一个生成器,它总是在列表上返回迭代器

if len(seq) <= 1: yield seq
表示“现在迭代不同的列表序列”,在这种情况下,这是第一个列表之后元素的所有排列序列。在每次迭代中,我们都有一个嵌套循环,它将第一个元素插入置换的每个位置并产生结果

我希望这有帮助。这对我来说有点难,因为我不知道你到底对什么感到困惑

更新:OP想知道为什么第一个结果的顺序相反。考虑这条线:

yield perm[i:] + seq[0:1] + perm[:i]
对于第一个结果(i=0),这相当于
yield perm+seq[0:1]
——第一个元素被发送到生成列表的末尾。通过归纳,该结果与
seq
相反。如果您希望第一个结果是
['police'、'buffalo'、'fish']
,则可以执行以下操作:

yield perm[:i] + seq[0:1] + perm[i:]

您给出的代码根据以下算法工作:

  • 如果序列有一项或为空,则唯一的排列是序列本身
  • 将序列分为第一个元素和所有剩余元素的列表
  • 根据同样的算法,考虑序列剩余部分的所有排列。对于每个排列:
  • 对于排列中的每个位置:
  • 在该位置拆分排列
  • 在该拆分中插入原始序列的第一个元素。这是原始序列的新排列
  • 完成了
  • 原始代码实现第3.1.2点的方式有点奇怪。我们可以通过使用更多的变量来更清楚地显示与算法的关系,从而使这一点更加清晰-这假设您使用的是Python 3:

    def permutations(seq):
        if len(seq) <= 1: 
            yield seq 
        else:
            first, *rest = seq
            for perm in permutations(rest):
                for i in range(len(perm)+1):
                    before = perm[:i]
                    after = perm[i:]
                    yield after + [first] + before
    

    您给出的代码根据以下算法工作:

  • 如果序列有一项或为空,则唯一的排列是序列本身
  • 将序列分为第一个元素和所有剩余元素的列表
  • 根据同样的算法,考虑序列剩余部分的所有排列。对于每个排列:
  • 对于排列中的每个位置:
  • 在该位置拆分排列
  • 在该拆分中插入原始序列的第一个元素。这是原始序列的新排列
  • 完成了
  • 原始代码实现第3.1.2点的方式有点奇怪。我们可以通过使用更多的变量来更清楚地显示与算法的关系,从而使这一点更加清晰-这假设您使用的是Python 3:

    def permutations(seq):
        if len(seq) <= 1: 
            yield seq 
        else:
            first, *rest = seq
            for perm in permutations(rest):
                for i in range(len(perm)+1):
                    before = perm[:i]
                    after = perm[i:]
                    yield after + [first] + before
    

    可能重复@KobiK OP特别询问
    yield
    如何在递归函数中工作。@Adrian Ratnapala,实际上你是对的,因为yield在递归函数中的工作方式不同。@KobiK根据你的观点,它的工作方式是相同的。它不会向最终消费者产生结果,只会向直接调用方产生结果——就像任何其他生成器一样。可能的重复@KobiK OP会具体询问
    yield
    如何在递归函数中工作。@Adrian Ratnapala,实际上你是对的,因为在递归函数中,yield的工作方式不同。@KobiK根据你的观点,它的工作方式也一样。它不会给最终消费者带来结果,只会给直接的呼叫者带来结果——就像任何其他生成器一样。谢谢您的回答。我不明白的是为什么结果以“[“鱼”、“水牛”、“警察”]”开头。也许我认为我不能理解置换函数的递归结构。@GoodGJ我认为这与递归没有多大关系。这只是结果的构造方式,请参阅我的更新以了解详细信息。感谢您的回答。我不明白的是为什么结果以“[“鱼”、“水牛”、“警察”]”开头。也许我认为我不能理解置换函数的递归结构。@GoodGJ我认为这与递归没有多大关系。这只是构建结果的方式,请参阅我的更新以了解详细信息