簡體   English   中英

遞歸給了我完全錯誤的答案

[英]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 foundres += ps(chk,n,ns)會使算法相加兩次。

例如X = 10, N = 2: Outputs 0, Expected 1因為:

c=1:

  • 10 - 1^2 > 0 -> res += ps(chk,n,ns)

c=3:

  • 9 - 3^2 == 0 -> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM