5 回答

TA貢獻1898條經驗 獲得超8個贊
問題在于變量對會重置每個遞歸調用...當使用計數遞歸算法時,您不需要計數的變量,這就是美妙之處相反,嘗試思考如何遞歸調用可以幫助您計數。
def countpairs(s):
if len(s)<2:
return 0
elif s[0].lower() == s[1].lower():
return countpairs(s[1:])+1
else:
return countpairs(s[1:])
print(countpairs('Hello Salaam'))
就這樣,在遞歸調用中,“計數器”每次應該變大,將計數器視為函數堆棧(或類似的東西)的一部分。

TA貢獻1784條經驗 獲得超7個贊
您需要稍微了解一下遞歸將執行的操作:它將遞歸地調用該函數以從該點開始對對進行計數,然后(它應該)添加此實例找到的對(如果有)。
因此,您的函數需要對遞歸調用的結果執行某些操作,而不僅僅是原樣返回。例如,而不是這個
elif s[0].lower() == s[1].lower(): pairs = +1 return countpairs(s[1:])
你可以這樣寫:
elif s[0].lower() == s[1].lower(): return countpairs(s[1:]) + 1
沿著這些思路。您需要做更多的工作才能使其正確,但我希望您明白這一點。

TA貢獻2051條經驗 獲得超10個贊
您需要修復語法:pairs=+1應該是 pairs+=1, 與 相同pairs=+0。您可以將總數傳遞到下一個級別。
def countpairs(s, pairs=0):
if len(s)<2:
return pairs #base case
elif s[0].lower() == s[1].lower(): #recursion
pairs+=1
return countpairs(s[1:], pairs)
else: #recursion
pairs+=0
return countpairs(s[1:], pairs)
print(countpairs('Hello Salaam')) # 2

TA貢獻1802條經驗 獲得超10個贊
您可以通過創建遞歸嵌套函數并pairs在外部函數中定義來完成此操作。這就是我的意思(修復了遇到的其他問題):
def countpairs(s):
pairs = 0
def _countpairs(s):
nonlocal pairs # Since it's not local nor global.
if len(s) < 2: # base case
return pairs
elif s[0].lower() == s[1].lower():
pairs += 1
return _countpairs(s[1:]) # recursion
else:
return _countpairs(s[1:]) # recursion
return _countpairs(s)
print(countpairs('Hello Salaam')) # -> 2

TA貢獻1883條經驗 獲得超3個贊
該代碼的計算結果始終為零,因為最后一次遞歸的 s 長度始終小于 2。而是使用 global 關鍵字來獲取對的值。
numberOfPairs = 0
pairsList = []
def countpairs(s):
global numberOfPairs
if len(s)<2:
print("doing nothing")
return 0 #base case
elif s[0].lower() == s[1].lower(): #recursion
numberOfPairs+=1
newString = f"{s[0]} is equal to {s[1]}"
print(newString)
pairsList.append(newString)
return countpairs(s[1:])
else:
print(f"nothing happened: {s[0]}") #recursion
return countpairs(s[1:])
print(f"\nThe returned value of countpairs is: {countpairs('Hello Salaam')}")
print(f"Number of pairs: {numberOfPairs}")
print(pairsList)
添加回答
舉報