class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res = []
subset = []
def dfs(i):
if i >= len(nums):
res.append(subset.copy())
# print(res)
print(subset)
return
subset.append(nums[i])
dfs(i+1)
print("hi")
subset.pop()
dfs(i+1)
print('hello')
dfs(0)
return res
此代码用于查找给定整数列表的子集,并且工作正常。但我无法跟踪代码如何工作,所以我添加了 print(subset)
、print('hi')
和 print('hello')
,但我无法理解。
输入:[1,2]
输出:
[1, 2]
hi
[1]
hello
hi
[2]
hi
[]
hello
hello
我只能理解输出的前 4 行(当我变成 2 时,它打印 [1,2]
然后 hi
然后弹出 2 并返回 [1]
然后 hello
.)我在想的是,如果它打印 hello
意味着函数调用已完成,那么为什么它适用于其余的子集 (hi
, 2
, hi
, {{ 1}}, []
hello
)?
希望,我能解释我的疑惑!
谢谢:)
答案 0 :(得分:1)
不确定我是否理解,但是这里的“hello”确实意味着函数调用已完成,因为在某些情况下,它是调用函数时最后打印的内容。
特别是当调用 dfs
且 i
小于 len(nums)
时,该函数将在末尾打印“hello”。
但请注意 dfs
函数内部是如何调用 dfs(i+1)
两次的。这使它成为一个递归函数 - 一个调用自身的函数。
考虑起来可能会很复杂 - 但 dfs(0)
调用 dfs(1)
两次,并且每个 dfs(1)
调用 dfs(2)
两次。 2 是列表的长度,因此它是通过从内部 if 块返回(而不是通过以“hello”结尾的外部 dfs 调用)来停止递归的基本情况。
因此,我们应该在第一个 dfs(1)
完成后看到 1 hello,然后在第二个 dfs(1)
完成后看到 1 hello - 一旦 dfs(1)
的每个返回,dfs(0) 最终可以返回并打印自己的“你好”——总共 3 个“你好”。这正是我们所看到的。