<p>试试这个,这是一个简单的解决方案:</p>
<pre><code>def recVowelCount(s):
if not s:
return 0
return (1 if s[0] in 'aeiouAEIOU' else 0) + recVowelCount(s[1:])
</code></pre>
<p>当元音是大写或小写时,它会考虑大小写。这可能不是递归遍历字符串的最有效方法(因为每次递归调用都会创建一个新的切片字符串),但很容易理解:</p>
<ul>
<li>基本大小写:如果字符串为空,则它有零个元音。</li>
<li>递归步骤:如果第一个字符是元音,则向解决方案中添加1,否则添加0。不管怎样,通过删除第一个字符并继续遍历字符串的其余部分来推进递归。</li>
</ul>
<p>第二步最终会将字符串长度减少到零,从而结束递归。或者,可以使用<a href="http://en.wikipedia.org/wiki/Tail_call" rel="nofollow">tail recursion</a>来实现相同的过程,但考虑到CPython没有实现<a href="http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html" rel="nofollow">tail recursion elimination</a>,这不会对性能产生任何影响。</p>
<pre><code>def recVowelCount(s):
def loop(s, acc):
if not s:
return acc
return loop(s[1:], (1 if s[0] in 'aeiouAEIOU' else 0) + acc)
loop(s, 0)
</code></pre>
<p>有趣的是,如果我们取消了解决方案必须是递归的限制,我将这样解决它:</p>
<pre><code>def iterVowelCount(s):
vowels = frozenset('aeiouAEIOU')
return sum(1 for c in s if c in vowels)
</code></pre>
<p>无论如何,这是有效的:</p>
<pre><code>recVowelCount('murcielago')
> 5
iterVowelCount('murcielago')
> 5
</code></pre>