递归函数删除元音字母
我正在尝试写一个递归程序,这个程序可以返回一个单词中所有不是元音字母的字母。现在我的代码可以打印出“University”这个词中的所有非元音字母,但它一直运行下去,永远不会结束。有没有什么建议?
def removeVowels9(aString):
if len(aString) == 0:
return newString
else:
newString = aString[1:len(aString) + 1]
firstLetter = aString[0]
#print(firstLetter)
if firstLetter in "aeiouAEIOU":
return removeVowels9(newString)
else:
newString = newString + firstLetter
print(newString)
return removeVowels9(newString)
1 个回答
6
很明显,你的代码从来没有达到基本情况,因为你会遇到一个 NameError
(newString
还没有被定义)。
为什么会这样呢?我们来看一下你的第三种情况:
else: # starts with consonant
newString = newString + firstLetter # add first letter to the end?
return removeVowels9(newString) # repeat
一旦你把所有的元音字母去掉,这段代码就会一直循环处理辅音字母,正如你从输出结果中应该看到的那样:
>>> removeVowels9("University")
iversityn
ersitynv
sitynvr
itynvrs
ynvrst # all vowels gone
nvrsty
vrstyn
rstynv
stynvr
tynvrs
ynvrst # just keeps looping
...
这里有一个最简单的修复方法:
>>> def removeVowels9(aString):
if len(aString) == 0:
return aString # aString, not newString
else:
newString = aString[1:len(aString) + 1]
firstLetter = aString[0]
#print(firstLetter)
if firstLetter in "aeiouAEIOU":
return removeVowels9(newString)
else:
return firstLetter + removeVowels9(newString) # add first letter back at start, after processing rest
>>> removeVowels9("University")
'nvrsty'
不过这样写会更整洁:
def remove_vowels(s):
"""Recursively remove vowels from the input."""
if not s: # empty string
return s
elif s[0] in "aeiouAEIOU": # first character is vowel
return remove_vowels(s[1:]) # skip first character and process rest
return s[0] + remove_vowels(s[1:]) # return first character and process rest
这样做:
>>> remove_vowels("University")
'nvrsty'
注意要和 变量命名等的风格指南 兼容。