当查找数组的所有子集时,结果数组返回空子集,知道这里发生了什么吗?



我目前正在尝试存储递归数组的所有可能子集。当在我的result数组中存储subset时,我得到一个空的嵌套数组。然而,当我在基本情况下打印subset时,它出现了。有人知道为什么subset不附加到result

下面是我的代码:

def see_sequences(array):
subset = list()
result = list()
hel(array, subset, 0, result)
return result

def hel(arr, subset, i,result):
if i == len(arr):
result.append(subset)

else:
subset.append(None)
hel(arr, subset,i+1, result)
subset.pop()
subset.append(arr[i])
hel(arr,subset,i+1, result)
subset.pop()

这是result

[[], [], [], [], [], [], [], [], []]

在主,我正在运行see_sequences([1,2,3])。谢谢你的帮助!

你可能有兴趣知道为什么你的列表都是空的。

subset.append(None)
hel(arr, subset,i+1, result)
subset.pop()

对于每个append都有一个匹配的pop。弹出发生在对hel()的递归调用之后,其中subset被这样使用:

if i == len(arr):
result.append(subset)

每一次,你是附加完全相同的result列表。元素的数量在增长,但所有的元素都是完全相同的列表。它们不是同一列表的副本,更不是列表当前状态的副本——它们实际上都是相同的对象。

当递归结束并且递归调用unwind时,pop方法将删除所有附加的元素。在流程结束时,列表为空。当你的print语句执行时,你打印了9次相同的空列表。

我还想指出,你的算法不是一个真正的递归,即使你的函数正在调用自己。实际上,您已经以一种看起来像递归的方式编写了一个简单的for循环。在这里初始化一个循环索引:

hel(array, subset, 0, result)

,因为您将第三个参数设置为0。在这里增加循环索引:

hel(arr, subset,i+1, result)

当你给i加1时,你在这里终止循环:

if i == len(arr):
result.append(subset)

通过检查你是否已经到达列表的末尾。

你传递所有你正在处理的变量到递归调用的堆栈。你所做的就是在所有的代码中隐藏基本的循环结构。

我不知道你为什么要用递归来解决这个问题。据我所知,递归在这里帮不了你。如果您将此作为学习编程技术的练习,那么这似乎是一个糟糕的选择。如果你真的需要这个奇怪的算法在你正在做的项目中,试着不使用递归(如果你需要帮助,问一个不同的问题)。

最新更新