我目前正在尝试存储递归数组的所有可能子集。当在我的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)
通过检查你是否已经到达列表的末尾。
你传递所有你正在处理的变量到递归调用的堆栈。你所做的就是在所有的代码中隐藏基本的循环结构。
我不知道你为什么要用递归来解决这个问题。据我所知,递归在这里帮不了你。如果您将此作为学习编程技术的练习,那么这似乎是一个糟糕的选择。如果你真的需要这个奇怪的算法在你正在做的项目中,试着不使用递归(如果你需要帮助,问一个不同的问题)。