【发布时间】:2022-01-07 16:22:14
【问题描述】:
我在内部多次调用一个函数来解决子集和问题,使用它所调用的递归解决方案;无论如何,我无法弄清楚为什么 n (这是数组的元素数)值一开始会减少,直到它达到 0,这就是我得到它,但是,在它本身再次调用它之后,它使 n 值递增。为什么会发生这种情况,因为整个函数甚至对 n 值都没有增量贡献? n 的递增值从何而来?
代码如下:
def printAllSubsetsRec(arr, n, currentSubset, sum):
# If remaining sum is 0, then print all
# elements of current subset.
if (sum == 0):
i = 0
sumOfValue = 0
for value in currentSubset:
i += 1
sumOfValue += value
if (i == len(currentSubset)):
print(value, " = ", sumOfValue)
else:
print(value, end=" + ")
return True
# If there are no elements in the array and the sum is not equal to 0.
if (n == 0 and sum != 0):
return None
# I consider two cases for every element:
# a) Excluding last element.
# b) Including last element in current subset.
# -------------------------------------------------
# Excluding the last element:
printAllSubsetsRec(arr, n - 1, currentSubset, sum)
v = [] + currentSubset
v.append(arr[n - 1])
# Including the last element:
printAllSubsetsRec(arr, n - 1, v, sum - arr[n - 1])
#Main:
arr = [10, 7, 5, 18, 12, 20, 15]
sum = 35
n = len(arr)
currentSubset = []
printAllSubsetsRec(arr, n, currentSubset, sum)
输出应该是:
18 + 7 + 10 = 35
12 + 18 + 5 = 35
20 + 5 + 10 = 35
15 + 20 = 35
提前致谢!
【问题讨论】:
-
您看到了在同一个函数中进行两次递归调用的效果。其中第一个被调用,导致 n 减少并建立一个递归调用堆栈。这种情况一直持续到您返回为止。此时堆栈展开一层,现在发生第二次递归调用。 “n”的值增加了,因为仍然有一堆调用保留了它们原来的“n”。
-
我猜这只是递归的一种常见性质,除非递归结构是线性的。考虑一个递归问题,以获得为了逃离迷宫而必须采取的步骤数。当您在迷宫中蜿蜒前行时,您通常会增加步数,但是一旦您遇到死胡同,您就会回到前一个岔路口,就像您减少 n。但实际上它只是回到原始调用堆栈并尝试另一条路径(n 减少)。
-
顺便说一下,不要使用名称
sum,因为它会覆盖内置函数。 -
谢谢你们,我明白了!
标签: python python-3.x function recursion subset-sum