这是一个递归问题,它打印数组的子集

it's a recursion problem that prints subsets of an array

提问人:Waqar 提问时间:1/16/2023 最后编辑:Mathias R. JessenWaqar 更新时间:1/16/2023 访问量:38

问:

class sub: 
  def f1(self,s1): 
    return self.f2([ ], (s1)) 

  def f2(self,curr,s1): 
    if s1: 
      return self.f2(curr,s1[1:]) + self.f2(curr + [s1[0]], s1[1:]) 
    return [curr] 

a=[]
n=int(input("enter a number:")) 

for i in range(0,n): 
  b=int(input("enter element:")) 
  a.append(b) 
  print("subset:") 
  print(sub().f1(a))

我不明白的是 f2 方法是如何工作的,以及这背后的过程是什么

我不明白的是 f2 方法是如何工作的,以及这背后的过程是什么 如果有人可以借助图表来解释它,那将非常值得赞赏。先谢谢你!

Python 递归 ArrayList 方法

评论

1赞 Waqar 1/16/2023
class sub: def f1(self,s1): return self.f2([ ], (s1)) def f2(self,curr,s1): if s1: return self.f2(curr,s1[1:]) + self.f2(curr + [s1[0]], s1[1:]) return [curr] a=[] n=int(input(“enter a number:”)) for i in range(0,n): b=int(input(“enter element:”)) a.append(b) print(“subset:”) print(sub().f1(a))

答:

1赞 Stef 1/16/2023 #1

在这里,你必须明白,它应该是“所有子集的列表,但每个子集都以 ”。f2(curr, s1)s1curr

您可以在以下几个示例中验证它是否有效:

  • f2('xyz', 'abc')['xyz', 'xyzc', 'xyzb', 'xyzbc', 'xyza', 'xyzac', 'xyzab', 'xyzabc'];
  • f2(c, '')只是,对于任何.[c]c

如果 case 不为空,则返回值是一个由两半组成的列表:s1f2(curr,s1[1:]) + f2(curr + [s1[0]], s1[1:])

  • 上半场f2(curr,s1[1:]);
  • 下半场.f2(curr + [s1[0]], s1[1:])

前半部分是 的所有子集的列表,每个子集都以 开头。请注意,的子集恰好是不包含 的子集。s1[1:]currs1[1:]s1s[0]

后半部分是 的所有子集的列表,每个子集都以 和 为前缀。请注意,“以 ”为前缀的 的所有子集与 “包含 的所有子集 .s1[1:]currs[0]s1[1:]s[0]s1s[0]

换句话说,代码行:

return self.f2(curr,s1[1:]) + self.f2(curr + [s1[0]], s1[1:]) 

可以理解为:

所有子集的列表分为两半:首先是不包含 的子集列表,然后是包含 的子集列表。s1s[0]s[0]

这两半是使用递归计算的。