为了账号安全,请及时绑定邮箱和手机立即绑定

使用递归选择偶数

使用递归选择偶数

富国沪深 2021-08-14 16:02:34
这里我定义了一个函数,它接受一个列表并返回同一个列表中偶数的计数。当我运行程序时,我得到 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]))我的问题在哪里?
查看完整描述

3 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

当前的实现有两个基本问题:

  1. c是 an int,并且ints 是不可变的。如果更改c,因此,这也并不意味着c在递归调用的“更新”,每次递归调用c将具有价值0; 和

  2. 如果第一项是偶数,则不会返回值,因此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))。


查看完整回答
反对 回复 2021-08-14
?
繁花如伊

TA贡献2012条经验 获得超12个赞

万一lst[0] % 2 == 0,您没有返回任何内容(因此隐式返回None)。您也永远不会c在递归中包含 的更新值。将其更改为


if lst == []:

    return c


if lst[0] % 2 == 0:

    c += 1


return count_even(lst[1:], c)

你很好。由于其他答案包括一些漂亮的替代解决方案,我将继续提名


def count_even(lst):

    return 1 - lst[0]%2 + count_even(lst[1:]) if lst else 0

以及。


查看完整回答
反对 回复 2021-08-14
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

你几乎做到了。只是一个简单的修正。您正在调用 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]))



查看完整回答
反对 回复 2021-08-14
  • 3 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信