计算给定整数列表的子集

时间:2021-06-28 08:28:29

标签: python list recursion

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)?

希望,我能解释我的疑惑!
谢谢:)

1 个答案:

答案 0 :(得分:1)

不确定我是否理解,但是这里的“hello”确实意味着函数调用已完成,因为在某些情况下,它是调用函数时最后打印的内容。 特别是当调用 dfsi 小于 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 个“你好”。这正是我们所看到的。

相关问题