count
in lenRecur
is not一个全球性的。它是一个作用域变量。
在以这种方式工作之前,您需要使用 Python 3;你正在寻找nonlocal陈述 http://docs.python.org/3/reference/simple_stmts.html#the-nonlocal-statement添加到Python 3。
在 Python 2 中,您可以通过使用可变的(例如列表)来解决此限制count
反而:
def lenRecur(s):
count = [0]
# ...
def leng(s):
if len(s)==0:
return count[0]
else:
count[0] += 1
return lenIter(s[1:])
现在你不再改变count
自己命名;它保持不变,它一直引用同一个列表。你所做的只是改变第一个元素包含 in the count
list.
另一种“拼写”是count
函数属性:
def lenRecur(s):
# ...
def leng(s):
if len(s)==0:
return leng.count
else:
leng.count += 1
return lenIter(s[1:])
leng.count = 0
Now count
不再是本地的lenRecur()
;它已成为不变的属性lenRecur()
函数代替。
对于你的具体问题,你实际上想得太多了。只需让递归进行求和即可:
def lenRecur(s):
def characters_only(s):
return ''.join([c for c in s if c.isalpha()])
def len_recursive(s):
if not s:
return 0
return 1 + len_recursive(s[1:])
return len_recursive(characters_only(s))
Demo:
>>> def lenRecur(s):
... def characters_only(s):
... return ''.join([c for c in s if c.isalpha()])
... def len_recursive(s):
... if not s:
... return 0
... return 1 + len_recursive(s[1:])
... return len_recursive(characters_only(s))
...
>>> lenRecur('The Quick Brown Fox')
16