使用递归选择偶数

这里我定义了一个函数,它接受一个列表并返回同一个列表中偶数的计数。当我运行程序时,我得到 None 作为回报。


def count_even(lst, c = 0):

    """

    parameters : a lst of type list

    returns : the even elements from that list

    """

    if lst == []:

        return c

    if lst[0] % 2 == 0:

        c += 1

    else:

        return count_even(lst[1:])



print(count_even([1,2,3,4,5,6,7,8,9]))

我的问题在哪里?


富国沪深
浏览 160回答 3
3回答

POPMUISE

当前的实现有两个基本问题:c是 an int,并且ints 是不可变的。如果更改c,因此,这也并不意味着c在递归调用的“更新”,每次递归调用c将具有价值0; 和如果第一项是偶数,则不会返回值,因此None在这种情况下Python 将返回。def count_even(lst, c = 0):    if lst == []:        return c    if lst[0] % 2 == 0:        c += 1    # no else    return count_even(lst[1:], c+1)  # pass a new value for c然而,更紧凑的表示是:def count_even(lst, c = 0):    if not lst:        return c    return count_even(lst[1:], c + 1 - lst[0] % 2)但是请注意,线性递归通常不是一个好主意,因为调用堆栈会随着元素数量的增加而增长,因此很容易导致溢出(尤其是因为 Python 没有实现尾调用优化 (TCO))。

繁花如伊

万一lst[0] % 2 == 0,您没有返回任何内容(因此隐式返回None)。您也永远不会c在递归中包含 的更新值。将其更改为if lst == []:    return cif lst[0] % 2 == 0:    c += 1return count_even(lst[1:], c)你很好。由于其他答案包括一些漂亮的替代解决方案,我将继续提名def count_even(lst):    return 1 - lst[0]%2 + count_even(lst[1:]) if lst else 0以及。

海绵宝宝撒

你几乎做到了。只是一个简单的修正。您正在调用 else 块中的递归,这是不正确的。您应该在块之外考虑它。检查以下代码:def count_even(lst, c = 0):    """    parameters : a lst of type list    returns : the even elements from that list    """    if lst == []:        return c    if lst[0] % 2 == 0:        c = c + 1    return c + count_even(lst[1:])print(count_even([1,2,3,4,5,6,7,8,9]))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python