递归基本情况失败

时间:2015-02-08 03:46:32

标签: python debugging recursion computer-science

我正在寻找代码最后一行的错误,但我无法弄清楚它是什么。有任何想法吗?

def letterScore( let ):
    let.lower()
    if let in 'aAnNoOeErRsStTuUiIlL':
        return 1
    elif let in 'dDgG':
        return 2
    elif let in 'bBcCpPmM':
        return 3
    elif let in 'fFhHvVwWyY':
        return 4
    elif let in 'kK':
        return 5 
    elif let in 'jJxX':
        return 8
    elif let in 'qQzZ':
        return 10
    else:
        return 0

def scrabbleScore( s ):
    return letterScore(s[0]) + scrabbleScore(s[1:len(s)])

2 个答案:

答案 0 :(得分:1)

问:你的递归函数什么时候“触底”并停止递归?

答:没有。

问:当时,它会停止递归吗?

答:len(s) == 0

Q值。 len(s) == 0实际会发生什么?

一个。您致电s[0]并以IndexError消亡。

如果您希望它是递归的,它应该看起来像

def scrabble_score(s):
    if s:   # Pythonic idiom for `len(s) > 0`
        return letter_score(s[0]) + scrabble_score(s[1:])
    else:
        return 0

然而没有充分的理由让这个递归;迭代方法更简单,更快,

SCORES = dict(zip(
    "abcdefghijklmnopqrstuvwxyz",
    [1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10]
))

def letter_score(ch, scores=SCORES):
    return scores.get(ch.lower(), 0)

def scrabble_score(word):
    return sum(letter_score(ch) for ch in word)

答案 1 :(得分:0)

问题在于递归调用:

scrabbleScore(s[0])

s作为空字符串返回时(递归的基本情况),此调用将失败并抛出异常。

旁注:该行没有任何意义:let.lower() - 它没有做任何事情。