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之类堆栈的语言来说,这不是一个好主意。感谢您的帮助,现在变得更有意义了@琼尔夏普@