提问人:Waqar 提问时间:1/16/2023 最后编辑:Mathias R. JessenWaqar 更新时间:1/16/2023 访问量:38
这是一个递归问题,它打印数组的子集
it's a recursion problem that prints subsets of an array
问:
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 方法是如何工作的,以及这背后的过程是什么 如果有人可以借助图表来解释它,那将非常值得赞赏。先谢谢你!
答:
1赞
Stef
1/16/2023
#1
在这里,你必须明白,它应该是“所有子集的列表,但每个子集都以 ”。f2(curr, s1)
s1
curr
您可以在以下几个示例中验证它是否有效:
f2('xyz', 'abc')
是['xyz', 'xyzc', 'xyzb', 'xyzbc', 'xyza', 'xyzac', 'xyzab', 'xyzabc']
;f2(c, '')
只是,对于任何.[c]
c
如果 case 不为空,则返回值是一个由两半组成的列表:s1
f2(curr,s1[1:]) + f2(curr + [s1[0]], s1[1:])
- 上半场
f2(curr,s1[1:])
; - 下半场.
f2(curr + [s1[0]], s1[1:])
前半部分是 的所有子集的列表,每个子集都以 开头。请注意,的子集恰好是不包含 的子集。s1[1:]
curr
s1[1:]
s1
s[0]
后半部分是 的所有子集的列表,每个子集都以 和 为前缀。请注意,“以 ”为前缀的 的所有子集与 “包含 的所有子集 .s1[1:]
curr
s[0]
s1[1:]
s[0]
s1
s[0]
换句话说,代码行:
return self.f2(curr,s1[1:]) + self.f2(curr + [s1[0]], s1[1:])
可以理解为:
所有子集的列表分为两半:首先是不包含 的子集列表,然后是包含 的子集列表。
s1
s[0]
s[0]
这两半是使用递归计算的。
评论