我多次呼叫內部函式來解決子集求和問題,使用它所呼叫的遞回解決方案;無論如何,我無法弄清楚為什么 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
提前致謝!
uj5u.com熱心網友回復:
遞回是一種函式式遺產,因此以函式式風格使用它會產生最好的結果。這意味著避免諸如突變、變數重新分配和其他副作用之類的事情——
if沒有對應的邏輯else- 突變和再分配
i和sumOfValue - 副作用如
print
遞回不一定是困難或痛苦的。使用功能學科,我們可以subsets(t,n)用歸納推理來寫——
- 如果目標和
n為零,則產生空解 - (歸納)否則
n為負或正。如果n是負數或輸入陣列t為空,則我們越界。停止迭代。 - (inductive)
n是正的并且t至少有一個元素。對于所有s的子問題(t[1:],n-t[0]),在前面加上t[0]要s和產量。并產生子問題的所有結果(t[1:],n)
def subsets(t, n):
if n == 0:
yield () #1
elif n < 0 or not t:
return #2
else:
for s in subsets(t[1:], n - t[0]): #3
yield (t[0], *s)
yield from subsets(t[1:], n)
for s in subsets([10, 7, 5, 18, 12, 20, 15], 35):
print(s)
(10, 7, 18)
(10, 5, 20)
(5, 18, 12)
(20, 15)
注意 -
- 所有操作都不會改變或重新分配變數
- 副作用如
print被交易yield - 呼叫者可以以任何想要的方式自由利用和轉換結果
將結果格式化為數學運算式 -
for s in subsets([10, 7, 5, 18, 12, 20, 15], 35):
print(" ".join(map(str, s)), "=", 35)
10 7 18 = 35
10 5 20 = 35
5 18 12 = 35
20 15 = 35
要將生成器的所有輸出收集到串列中,請使用list-
print(list(subsets([10, 7, 5, 18, 12, 20, 15], 35)))
[(10, 7, 18), (10, 5, 20), (5, 18, 12), (20, 15)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/371040.html
上一篇:反向串列并將其附加到istelf
