Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Recursion - Fatal编程技术网

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

我正在学习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 == 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.

那真是太美了。谢谢你花时间来帮助我,太美了。谢谢你抽出时间来帮助我