Python 删除元音的递归函数
我正在尝试编写一个递归程序,返回非元音单词的一串字母。我的代码现在打印出“大学”的所有非元音,但永远不会结束。有什么想法吗Python 删除元音的递归函数,python,Python,我正在尝试编写一个递归程序,返回非元音单词的一串字母。我的代码现在打印出“大学”的所有非元音,但永远不会结束。有什么想法吗 def removeVowels9(aString): if len(aString) == 0: return newString else: newString = aString[1:len(aString) + 1] firstLetter = aString[0] #print(fir
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)
很明显,您永远不会碰到基本情况,因为您将得到一个
namererror
(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'
注意与for变量名等的兼容性。join([c在“UniversitY”中代表c,如果c.lower()不在“aeiou”中)给出了“nvrstY”,这是达到最大递归深度的一种非常好的方法。您在这里使用的技术称为“尾部递归”,对于使用Python之类堆栈的语言来说,这不是一个好主意。感谢您的帮助,现在变得更有意义了@琼尔夏普@