Вернуть сумму, исключая K и следующий номер в списке, используя рекурсию - PullRequest
0 голосов
/ 25 апреля 2020

Мой код должен получить целое число и список целых чисел. Он возвращает сумму целых чисел в списке, КРОМЕ, он игнорирует несчастный номер и номер, следующий сразу за несчастливым числом. Я только пытаюсь использовать рекурсию (НЕТ ИТЕРАЦИИ). Пока мой код работает для первых 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

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

Вам действительно нужно только два теста, которые помогут избежать ошибок. Тест для базового случая, который является пустым массивом и тест для неудачного числа. Вам не нужно проверять длину после базового случая, потому что вы можете передать пустой массив обратно. При этом функция может быть написана таким образом, чтобы она отражала требования в очень удобочитаемой форме:

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
0 голосов
/ 25 апреля 2020

Вы забыли исключить несчастливое число, если 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:])
0 голосов
/ 25 апреля 2020

Как сказал Марк Мейер, оно никогда не достигает 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:]) 
...