我能';“我不明白。”;“收益率”;在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:]
您给出的代码根据以下算法工作:
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
您给出的代码根据以下算法工作:
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我认为这与递归没有多大关系。这只是构建结果的方式,请参阅我的更新以了解详细信息