递归函数删除元音字母

-1 投票
1 回答
4616 浏览
提问于 2025-04-18 16:16

我正在尝试写一个递归程序,这个程序可以返回一个单词中所有不是元音字母的字母。现在我的代码可以打印出“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

很明显,你的代码从来没有达到基本情况,因为你会遇到一个 NameErrornewString 还没有被定义)。

为什么会这样呢?我们来看一下你的第三种情况:

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'

注意要和 变量命名等的风格指南 兼容。

撰写回答