以下 python 代碼使用遞回列印所有長度為 3 且總和為 2 的非負整數串列,它按預期作業:
def rek(f,sum,n,vector=[]): #applies f to all Z^n_ vectors of sum 'sum' if n==1: f(vector [sum]) else: for i in range(sum 1): rek(f,sum-i,n-1,vector [i]) rek(print,2,3)
Output:
[0, 0, 2] [0, 1, 1] [0, 2, 0] [1, 0, 1] [1, 1, 0] [2, 0, 0]
我的問題是我是否可以以及如何使用生成器來做到這一點?我希望能夠寫出類似的東西
for vector in vector_generator(2,3): print(vector)
列印相同的向量。
uj5u.com熱心網友回復:
您應該查看yieldand yield from,這是您的操作方法:
def vector_generator(sum, n, vector=()):
if n == 1:
yield vector (sum,)
else:
for i in range(sum 1):
yield from vector_generator(sum - i, n - 1, vector (i,))
請注意,我更改vector為元組,因為將可變物件作為默認引數是不好的做法(編輯值將更改默認引數)。
uj5u.com熱心網友回復:
您可以以簡單的方式將您的函式轉換為生成器:
def vector_generator(sum,n,vector=None):
vector = vector or []
if n==1:
yield vector [sum]
else:
for i in range(sum 1):
yield from vector_generator(sum-i,n-1,vector [i])
for vector in vector_generator(2,3):
print(vector)
uj5u.com熱心網友回復:
def gen(s,n):
nums = [0 for _ in range(n)]
while True:
if sum(nums) == s:
yield nums.copy()
cidx = 0
nums[cidx] = 1
while nums[cidx] == s 1:
nums[cidx] = 0
cidx = 1
if cidx == n:
return
nums[cidx] = 1
for vector in gen(2,3):
print(vector)
不是最佳解決方案,但它應該給出正確的結果。n它所做的基本上是用數字 [0- ]遍歷所有可能的長度陣列,s并產生總和為 的陣列s。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/473272.html
下一篇:使用遞回查找最大元素
