在python中如何在递归中使用变量

2024-10-03 09:20:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python学习递归。我写了一个程序,但它不能正常工作。我是python的初学者。我有两个函数scrabbleScore()letterScore()scrabbleScore()调用letterscore()以及自身。这是我的代码:

def letterScore( let ):
    if let in ['a','e','i','l','n','o','r','s','t','u']:
        return 1
    elif let in ['d','g']:
        return 2
    elif let in ['b','c','m','p']:
        return 3
    elif let in ['f','h','v','w','y']:
        return 4
    elif let=='k':
        return 5
    elif let in ['j','x']:
        return 8
    elif let in ['q','z']:
        return 10
    else:
        return 0

p = 0
def scrabbleScore( S ):
    if S == "":
        return 0
    else:
        global p
        p=p+letterScore(S[0])
        scrabbleScore(S[1:])
        return p

print "scrabbleScore('quetzal'):  25 ==", scrabbleScore('quetzal')
print "scrabbleScore('jonquil'):  23 ==", scrabbleScore('jonquil')
print "scrabbleScore('syzygy'):   25 ==", scrabbleScore('syzygy')
print "scrabbleScore('abcdefghijklmnopqrstuvwxyz'):  87 ==", scrabbleScore('abcdefghijklmnopqrstuvwxyz')
print "scrabbleScore('?!@#$%^&*()'):  0 ==", scrabbleScore('?!@#$%^&*()')
print "scrabbleScore(''):          0 ==", scrabbleScore('')    

Tags: in程序returnifdefelseprintlet
3条回答

它不能正常工作,因为您正在使用全局变量来存储中间结果。第一次调用“scrabbleScore”后,p值将变为25,您需要重置它。在

这里的解决方案是完全避免使用全局变量:

def scrabbleScore( S ):
    p = 0
    if S == "":
        return 0
    else:
        p = p + letterScore(S[0])
        p = p + scrabbleScore(S[1:])
        return p

每次调用p之后,变量p应再次初始化为零。这会解决你的问题。示例:

print "scrabbleScore('quetzal'):  25 ==", scrabbleScore('quetzal')
p=0
print "scrabbleScore('jonquil'):  23 ==", scrabbleScore('jonquil')

我会把你的拼字游戏分数改写成这样

def scrabbleScore(S):
    def helper(S, p):
        if S == "":
            return p
        else:
            p += letterScore(S[0])
            return helper(S[1:], p)

    return helper(S, 0)

你可以这样写。p被称为akkumulator,不应该是全局变量(通常,应该避免全局变量)。我没弄明白你的程序为什么不起作用,但我会打印出正确的结果。在

相关问题 更多 >