递归基本案例失败

Recursion base case fails

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

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

问题出在递归调用中:

scrabbleScore(s[0])

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

旁注:该行没有意义:let.lower() - 它什么也没做。

问:你的递归函数什么时候"bottom out"停止递归?

答:没有。

问:什么时候应该停止递归?

答:当len(s) == 0.

问。当 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)