递归中的变量位置

问题是我的代码不断将变量反映为零,这是由于该变量是在函数开始时分配的,因此每次我调用该函数时,该值都会计算为零。但是,我需要这个变量赋值才能使代码正常工作,并将其放置在 elif 语句中的计算结果仍然为零,而将变量放置在函数外部会导致函数无法工作。


该程序的目的是使用递归来计算字符串中连续字母对的数量,而代码中没有 for/while 循环。


def countpairs(s):

    pairs=0

    if len(s)<2:

        return 0                            #base case

    elif s[0].lower() == s[1].lower():       #recursion

        pairs=+1

        return countpairs(s[1:])

    else:                                   #recursion

        pairs=+0

        return countpairs(s[1:])

print(countpairs('Hello Salaam'))

由于“ll”和“aa”,该代码的计算结果应该为 2。


慕桂英546537
浏览 215回答 5
5回答

汪汪一只猫

问题在于变量对会重置每个递归调用...当使用计数递归算法时,您不需要计数的变量,这就是美妙之处相反,尝试思考如何递归调用可以帮助您计数。def countpairs(s):&nbsp; &nbsp; if len(s)<2:&nbsp; &nbsp; &nbsp; &nbsp;return 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; elif s[0].lower() == s[1].lower():&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return countpairs(s[1:])+1&nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return countpairs(s[1:])print(countpairs('Hello Salaam'))就这样,在递归调用中,“计数器”每次应该变大,将计数器视为函数堆栈(或类似的东西)的一部分。

噜噜哒

您需要稍微了解一下递归将执行的操作:它将递归地调用该函数以从该点开始对对进行计数,然后(它应该)添加此实例找到的对(如果有)。因此,您的函数需要对递归调用的结果执行某些操作,而不仅仅是原样返回。例如,而不是这个elif&nbsp;s[0].lower()&nbsp;==&nbsp;s[1].lower(): &nbsp;&nbsp;&nbsp;&nbsp;pairs&nbsp;=&nbsp;+1 &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;countpairs(s[1:])你可以这样写:elif&nbsp;s[0].lower()&nbsp;==&nbsp;s[1].lower(): &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;countpairs(s[1:])&nbsp;+&nbsp;1沿着这些思路。您需要做更多的工作才能使其正确,但我希望您明白这一点。

侃侃无极

您需要修复语法:pairs=+1应该是 pairs+=1, 与 相同pairs=+0。您可以将总数传递到下一个级别。def countpairs(s, pairs=0):&nbsp; &nbsp; if len(s)<2:&nbsp; &nbsp; &nbsp; &nbsp; return pairs&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #base case&nbsp; &nbsp; elif s[0].lower() == s[1].lower():&nbsp; &nbsp; &nbsp; &nbsp;#recursion&nbsp; &nbsp; &nbsp; &nbsp; pairs+=1&nbsp; &nbsp; &nbsp; &nbsp; return countpairs(s[1:], pairs)&nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#recursion&nbsp; &nbsp; &nbsp; &nbsp; pairs+=0&nbsp; &nbsp; &nbsp; &nbsp; return countpairs(s[1:], pairs)&nbsp;print(countpairs('Hello Salaam'))&nbsp; # 2

守候你守候我

您可以通过创建递归嵌套函数并pairs在外部函数中定义来完成此操作。这就是我的意思(修复了遇到的其他问题):def countpairs(s):&nbsp; &nbsp; pairs = 0&nbsp; &nbsp; def _countpairs(s):&nbsp; &nbsp; &nbsp; &nbsp; nonlocal pairs&nbsp; # Since it's not local nor global.&nbsp; &nbsp; &nbsp; &nbsp; if len(s) < 2:&nbsp; # base case&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return pairs&nbsp; &nbsp; &nbsp; &nbsp; elif s[0].lower() == s[1].lower():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pairs += 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return _countpairs(s[1:])&nbsp; # recursion&nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return _countpairs(s[1:])&nbsp; # recursion&nbsp; &nbsp; return _countpairs(s)print(countpairs('Hello Salaam'))&nbsp; # -> 2

白板的微信

该代码的计算结果始终为零,因为最后一次递归的 s 长度始终小于 2。而是使用 global 关键字来获取对的值。numberOfPairs = 0pairsList = []def countpairs(s):&nbsp; &nbsp; global numberOfPairs&nbsp; &nbsp; if len(s)<2:&nbsp; &nbsp; &nbsp; &nbsp; print("doing nothing")&nbsp; &nbsp; &nbsp; &nbsp; return 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #base case&nbsp; &nbsp; elif s[0].lower() == s[1].lower():&nbsp; &nbsp; &nbsp; &nbsp;#recursion&nbsp; &nbsp; &nbsp; &nbsp; numberOfPairs+=1&nbsp; &nbsp; &nbsp; &nbsp; newString = f"{s[0]} is equal to {s[1]}"&nbsp; &nbsp; &nbsp; &nbsp; print(newString)&nbsp; &nbsp; &nbsp; &nbsp; pairsList.append(newString)&nbsp; &nbsp; &nbsp; &nbsp; return countpairs(s[1:])&nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; print(f"nothing happened: {s[0]}")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#recursion&nbsp; &nbsp; &nbsp; &nbsp; return countpairs(s[1:])print(f"\nThe returned value of countpairs is: {countpairs('Hello Salaam')}")print(f"Number of pairs: {numberOfPairs}")print(pairsList)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python