[英]Recursion gives me completely wrong answers
我想找到方法的數量,給定的整數 X 可以分解為 N 次冪的數字和,並且每個被加數必須是唯一的。 例如,如果 X = 10 且 N = 3,我可以這樣分解這個數字:
10 = 2^3+1^3+1^3 ,但這不是有效的分解,因為數字 1 出現了兩次。 X = 10 和 N = 2 的有效分解是 10 = 3^2+1^2,因為這里沒有重復加數。
現在我嘗試使用遞歸並創建以下 Python 代碼
st = set(range(1,int(pow(X,1/float(N))))) # generate set of unique numbers
print(str(ps(X, N, st)))
def ps(x, n, s):
res = 0
for c in s:
chk = x-pow(c,n) # test validity
if chk > 0:
ns = s-set([c])
res += ps(chk,n,ns)
elif chk == 0:
res += 1 # one result is found
else:
res += 0 # no valid result
return res
我使用了一個名為 st 的集合,然后我遞歸地調用了函數 ps,其中包括基本情況“找到分解”和“未找到分解”。 此外,它通過僅考慮如何將給定數字分解為兩個被加數的方法,將較大的數字減少為較小的數字。
不幸的是,我得到了完全錯誤的結果,例如
X = 100, N = 3: Outputs 0, Expected 1
X = 100, N = 2: Outputs 122, Expected 3
X = 10, N = 2: Outputs 0, Expected 1
我的想法是正確的,但我認為問題出在遞歸的任何地方。 有人看到我做錯了什么嗎? 任何幫助將不勝感激。
暗示:
>>> X = 100
>>> N = 3
>>> int(pow(X, 1/float(N)))
4
>>> list(range(1, 4))
[1, 2, 3]
輸出對於您提供給它的輸入確實是正確的。
問題是 line res += 1 # one result is found
與res += ps(chk,n,ns)
會使算法相加兩次。
例如X = 10, N = 2: Outputs 0, Expected 1
因為:
c=1:
res += ps(chk,n,ns)
c=3:
res += 1 # one result is found
... return res
因此,在 c=3 res=1
返回到 c=1 調用,這將
res += ps(chk,n,ns)
和ps(chk,n,ns) = 1
,使res = 2
並使預期結果加倍。
例如X = 29, N = 2
。
29 = 2^2 + 3^2 + 4^2
從下到上求解(算法流程):
c=4 -> res += 1
... return res
c=3 -> res += ps()
-> res += 1
-> res = 2
... return res
c=2 -> res += ps()
-> res += 2
-> res = 4
... return res
但是 res 應該是 1。
解決方案:您不能將res
添加到res
。 並且您必須刪除之前的迭代對象以避免路徑重復。 檢查下面的解決方案(打印以便更好地理解):
def ps(x, n, s):
print(s)
print("")
return ps_aux(x, n, s, 0) # level
def ps_aux(x, n, s, level):
sum = 0
for idx, c in enumerate(s):
print("----> " * level + "C = {}".format(c))
chk = x - pow(c,n) # test validity
if chk > 0:
ns = s[idx + 1:]
sum += ps_aux(chk,n,ns, level + 1)
elif chk == 0:
print("OK!")
sum += 1 # one result is found
else:
sum += 0 # no valid result
return sum
嘗試:
X=10 # 1 solution
N=2
st = list(range(1,int(pow(X,1/float(N))) + 1 )) # generate set of unique numbers
print(str(ps(X, N, st)))
X=25 # 2 solutions [3,4], [5]
N=2
st = list(range(1,int(pow(X,1/float(N))) + 1 )) # generate set of unique numbers
print(str(ps(X, N, st)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.