Python 在列表中获取所有递归结果
我正在学习python递归。为了练习,我给了一个任务,找到列表的所有子集。例如,函数:Python 在列表中获取所有递归结果,python,list,recursion,Python,List,Recursion,我正在学习python递归。为了练习,我给了一个任务,找到列表的所有子集。例如,函数: subset([1,2)] should return [[1,2],[1],[2],[]] 我可以让我的函数在递归的帮助下打印这些结果 def subset(List): print(List) n = len(List) if n > 2: for i in range(n): subset(List[:i]+List[i+1:]) if n
subset([1,2)] should return [[1,2],[1],[2],[]]
我可以让我的函数在递归的帮助下打印这些结果
def subset(List):
print(List)
n = len(List)
if n > 2:
for i in range(n):
subset(List[:i]+List[i+1:])
if n == 2:
subset([List[0]])
subset([List[1]])
if n == 1:
subset([])
pass
L = [1,2]
test = subset(L)
打印语句打印:
[1, 2], [1], [], [2], []
我希望有一个函数不打印,而是返回一个列表中所给出的期望结果
我希望您能接受这一点。首先,如果您实际上不需要自己实现它,请使用标准库 但是这是一个有趣的递归学习问题,让我们仔细看看。 类似地,对于a)一次进行多个递归调用,b)需要以某种方式“累积”结果的复杂递归使用,我的建议是编写一个递归生成器。您可以机械地转换它:
- 将
替换为打印
产量
递归调用中获得收益(正如我在另一个答案中所指出的,对于不需要累积结果的情况,通常希望从
返回这些结果)
列表中,或者直接对其进行迭代
但是,您的算法也存在一个问题:缺少两个或多个原始元素的结果将多次出现(正如您已经看到的),因为有多个递归“路径”指向它们。您想要的算法是:
- 递归地获取不包含第一个元素的子集
- 对于其中的每一个,都会发出两个结果:一个结果前面有第一个元素,另一个结果没有
因此,我们将迭代结果,做一些修改,并在循环中yield
,而不是yield from
综上所述,它看起来像:
def power_set(items):
if not items: # empty set; base case for recursion.
yield items
return
# Pull off the first element,
first, *rest = items
# then iterate over the recursive results on the rest of the elements.
for without_first in power_set(rest):
yield [first] + without_first
yield without_first
# let's test it:
list(power_set([1,2,3]))
# [[1, 2, 3], [2, 3], [1, 3], [3], [1, 2], [2], [1], []]
# Good, just what we want - with no duplicates.
首先,如果您实际上不需要自己实现它,那么可以使用标准库
但是这是一个有趣的递归学习问题,让我们仔细看看。
类似地,对于a)一次进行多个递归调用,b)需要以某种方式“累积”结果的复杂递归使用,我的建议是编写一个递归生成器。您可以机械地转换它:
- 将
打印
替换为产量
从
递归调用中获得收益(正如我在另一个答案中所指出的,对于不需要累积结果的情况,通常希望返回这些结果)
然后从递归外部,您可以将结果收集到列表中,或者直接对其进行迭代
但是,您的算法也存在一个问题:缺少两个或多个原始元素的结果将多次出现(正如您已经看到的),因为有多个递归“路径”指向它们。您想要的算法是:
- 递归地获取不包含第一个元素的子集
- 对于其中的每一个,都会发出两个结果:一个结果前面有第一个元素,另一个结果没有
因此,我们将迭代结果,做一些修改,并在循环中yield
,而不是yield from
综上所述,它看起来像:
def power_set(items):
if not items: # empty set; base case for recursion.
yield items
return
# Pull off the first element,
first, *rest = items
# then iterate over the recursive results on the rest of the elements.
for without_first in power_set(rest):
yield [first] + without_first
yield without_first
# let's test it:
list(power_set([1,2,3]))
# [[1, 2, 3], [2, 3], [1, 3], [3], [1, 2], [2], [1], []]
# Good, just what we want - with no duplicates.
那真是太美了。谢谢你花时间来帮助我,太美了。谢谢你抽出时间来帮助我