【问题标题】:Return Sum excluding K and following number in list using Recursion使用递归返回列表中不包括 K 和以下数字的总和
【发布时间】:2020-04-25 18:58:24
【问题描述】:

我的代码应该接收一个整数和一个整数列表。它返回 列表中的整数之和除了,它忽略 不吉利的数字和紧跟在它后面的数字 倒霉的号码。我只是尝试使用递归(无迭代)。到目前为止,我的代码适用于前 5 个案例,但后 2 个案例存在问题,因为它们最后有不吉利的数字。我不会试图完全重写我的函数,只是在我目前拥有的内容中发现错误。

def unlucky(unlucky_num, a_list):
    """
    >>> unlucky(13,[1])
    1
    >>> unlucky(13,[1,2,3,4,5,6])
    21
    >>> unlucky(13,[13,1,2,3])
    5
    >>> unlucky(13,[1,13,2,3])
    4
    >>> unlucky(13,[13, 0])
    0
    >>> unlucky(13,[13,1,2,13,2,1,13]) #13,1,13,2,13 ignored
    3
    >>> unlucky(7,[7,4,5,7,5,4,7]) #7,4,7,5,7 ignored (7 is unlucky)
    9
    """

    if a_list == []:
        return 0
    if a_list[0] == unlucky_num:
        if len(a_list) > 1:
            return unlucky(unlucky_num, a_list[2:])
        return unlucky(unlucky_num, a_list)
    return a_list[0] + unlucky(unlucky_num, a_list[1:]) 

对于最后两种情况,我收到以下错误(文件名已编辑):

Error
**********************************************************************
File "------", line 39, in sum_unlucky
Failed example:
    sum_unlucky(13,[13,1,2,13,2,1,13]) #13,1,13,2,13 ignored
Exception raised:
    Traceback (most recent call last):
      File "-------", line 138, in __run
        exec(compile(example.source, filename, "single",
      File "<doctest sum_unlucky[5]>", line 1, in <module>
        sum_unlucky(13,[13,1,2,13,2,1,13]) #13,1,13,2,13 ignored
      File "-------", line 50, in sum_unlucky
        return sum_unlucky(unlucky_num, a_list[2:])
      File "---------", line 52, in sum_unlucky
        return a_list[0] + sum_unlucky(unlucky_num, a_list[1:])
      File "--------", line 50, in sum_unlucky
        return sum_unlucky(unlucky_num, a_list[2:])
      File "--------", line 52, in sum_unlucky
        return a_list[0] + sum_unlucky(unlucky_num, a_list[1:])
      File "-------", line 51, in sum_unlucky
        return sum_unlucky(unlucky_num, a_list)
      File "------", line 51, in sum_unlucky
        return sum_unlucky(unlucky_num, a_list)
      File "------", line 51, in sum_unlucky
        return sum_unlucky(unlucky_num, a_list)
      [Previous line repeated 986 more times]
      File "----", line 45, in sum_unlucky
        if a_list == []: 
    RecursionError: maximum recursion depth exceeded in comparison

【问题讨论】:

  • 你得到了什么结果?把它放在问题中是有帮助的,这样我们就可以更容易地看到问题。
  • 如果不清楚,我深表歉意。我正在使用以红色突出显示的 doctest 来演示示例输出。但会包含错误。
  • 没问题,提前准备好所有信息会有所帮助。很清楚您的期望,但有助于显示您实际获得的结果。
  • 您没有向 if a_list[0] == unlucky_num 提供 else,所以当列表中的最后一个数字是不幸的数字时,它永远不会停止。它不断返回return a_list[0] + unlucky(unlucky_num, a_list[1:])

标签: python list recursion list-comprehension


【解决方案1】:

您实际上只需要两个测试,这将更容易避免错误。对基本情况的测试,它是一个空数组和对倒霉数的测试。您不需要在基本情况之后测试长度,因为您可以传回一个空数组。这样,该函数就可以以一种非常易读的方式反映需求的方式编写:

def unlucky(unlucky_num, a_list):
    if not a_list:                             # base case
        return 0 

    head, *rest = a_list                       # rest will be [] when len(a_list) == 1

    if head == unlucky_num:
        return unlucky(unlucky_num, rest[1:])
    return head + unlucky(unlucky_num,rest)

unlucky(7,[7,4,5,7,5,4,7])
# 9

【讨论】:

    【解决方案2】:

    如果len(a_list) == 1,您忘记排除不吉利的数字。使用a_list[1:]

    def unlucky(unlucky_num, a_list):
        if a_list == []:
            return 0
    
        if a_list[0] == unlucky_num:
            if len(a_list) > 1:
                return unlucky(unlucky_num, a_list[2:])
            return unlucky(unlucky_num, a_list[1:])  # <- Here
        return a_list[0] + unlucky(unlucky_num, a_list[1:])
    

    但在这种情况下,由于a_list[1:] == [],您可以跳过递归调用而只需return 0。你也可以简化:

    def unlucky(unlucky_num, a_list):
        if a_list in ([], [unlucky_num]):
            return 0
        elif a_list[0] == unlucky_num:
            return unlucky(unlucky_num, a_list[2:])
        return a_list[0] + unlucky(unlucky_num, a_list[1:])
    

    【讨论】:

    【解决方案3】:

    正如 Mark Meyer 所说,它永远不会到达 a_list == []。试试:

    def unlucky(unlucky_num, a_list):
        if len(a_list) == 1:
            if a_list[0] == unlucky_num:
                return 0
            else:
                return a_list[0]
        if a_list[0] == unlucky_num:
            if len(a_list) > 1:
                return unlucky(unlucky_num, a_list[2:])
            return unlucky(unlucky_num, a_list)
        return a_list[0] + unlucky(unlucky_num, a_list[1:]) 
    

    【讨论】:

    • 这似乎有效,但是在&gt;&gt;&gt; unlucky(13,[13, 0])的情况下会产生另一个错误@
    猜你喜欢
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2019-03-31
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多