递归基本案例失败
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)
我正在寻找代码最后一行中的错误,但我无法弄清楚它是什么。有任何想法吗?
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)