为了账号安全,请及时绑定邮箱和手机立即绑定

递归中的变量位置

递归中的变量位置

慕桂英546537 2023-09-12 16:35:50
问题是我的代码不断将变量反映为零,这是由于该变量是在函数开始时分配的,因此每次我调用该函数时,该值都会计算为零。但是,我需要这个变量赋值才能使代码正常工作,并将其放置在 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。
查看完整描述

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'))

就这样,在递归调用中,“计数器”每次应该变大,将计数器视为函数堆栈(或类似的东西)的一部分。


查看完整回答
反对 回复 2023-09-12
?
噜噜哒

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

沿着这些思路。您需要做更多的工作才能使其正确,但我希望您明白这一点。


查看完整回答
反对 回复 2023-09-12
?
侃侃无极

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


查看完整回答
反对 回复 2023-09-12
?
守候你守候我

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


查看完整回答
反对 回复 2023-09-12
?
白板的微信

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)


查看完整回答
反对 回复 2023-09-12
  • 5 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信