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)
添加回答
举报