如何编写一个递归函数,它接受一个列表并返回不带元音的同一个列表?

2024-07-01 08:38:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我应该编写一个递归函数,该函数接受一个字符串列表或一个字符串列表,如果找到,则返回不带元音的列表。以下是我解决问题的尝试:

def noVow(seq):
    keys = ['a','i','e','o','u','u']
    if not seq or not isinstance(seq, list) :
        return 
    else:
        if seq[0]  in keys:
            del seq[0]
            return (noVow(seq[0:]))
        else:
            return (noVow(seq[1:]))


li = ["b", "c", "d","a"]
print (noVow(li))

我意识到bug存在于我的基本情况中,但是我无法想出正确的基本情况。在

注意递归函数必须用纯函数编程编写,即不允许有副作用。在


Tags: 函数字符串列表returnifdefnot情况
3条回答

return the same list without vowels

嗯,您是在递归调用中对原始列表进行切片,所以有一个拷贝不同于同一个列表。在

更重要的是,您的代码实际上可以工作,但是由于您传递的是列表的一个切片,那么片段中的元音项(不是原始列表)将被删除,而原始的元素保持不变。在

您可以使用一个从原始列表的开始结束的非切片变体:

def no_vow(seq, index=0):
    keys = ['a','i','e','o','u']
    if not seq or not isinstance(seq, list) or index >= len(seq):
        return 
    else:
        if seq[index] in keys:
            del seq[index]
            return no_vow(seq, index)
        else:
            return no_vow(seq, index+1)

最后,如果要打印结果,则不应该打印函数调用的输出(将是None),而应该打印列表。在


试验

^{pr2}$

你的基本情况返回一个None。因此,每当您传递空列表时,None都会被发送到递归调用的堆栈中。在

此外,您没有存储不是元音的字符,所以您的else大小写是错误的。在

你能得到的是这样的东西:

>>> def noVow(seq):
...     keys = ['a','i','e','o','u','u']
...     if not seq or not isinstance(seq, list) :
...         return []
...     else:
...         if seq[0] in keys:
...             return noVow(seq[1:])
...         else:
...             return [seq[0]] + noVow(seq[1:])

另外,seq[0:]相当于seq。在

def no_vowel(seq):
    if not isinstance(seq, list):
        raise ValueError('Expected list, got {}'.format(type(seq)))
    if not seq:
        return []
    head, *tail = seq
    if isinstance(head, list):
        return [[no_vowel(head)]] + no_vowel(tail)
    else:
        if head in 'aeiou':
            return no_vowel(tail)
        else:
            return [head] + novowel(tail)   

列表的酷解包是Python3的一个特性,与函数式编程的模式匹配非常相似。在

相关问题 更多 >

    热门问题