Как использовать рекурсию, чтобы найти делимые числа в списке? - PullRequest
0 голосов
/ 19 ноября 2018

Я делаю функцию, принимает список целых чисел в качестве аргумента, и я хочу посмотреть, есть ли в списке 5 элементов, которые делятся на 2.

Так, например, если я вызываюфункция "find_numbers" с этим вызовом:

  print(find_numbers([1,4,6,8,5,66,22,3]))

должна вернуть:

   True

, потому что в списке есть 5 элементов, которые делятся на два (4,6,8,66и 22) в противном случае он должен вернуть false .

Как мне поступить?

Спасибо за помощь!

Примечание: мне нужно использовать рекурсию для дальнейшего использования в программе, я знаю, что использование цикла будет проще, но позже это будет для меня головной болью (опять же, большое спасибо).

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Вот еще один подход, который ведет записи элементов списка, которые делятся на 2:

def divi(a, number=5, divs=[]):
    if a == []:
        return True if len(divs) == number else False
    if not a[0] % 2:
       divs.append(a[0])
    return divi(a[1:], divs)


test = [
    [1, 2, 4, 6, 3, 1],
    [1, 1, 1, 1, 1, 1],
    [1, 2, 2, 4, 6, 1],
    [1,2, 2, 2, 2, 2],
    [1]
]

for elm in test:
    divs = []
    print('{} => {} # {}'.format(elm, divi(elm, divs=divs), divs))

Вывод:

[1, 2, 4, 6, 3, 1] => False # [2, 4, 6]
[1, 1, 1, 1, 1, 1] => False # []
[1, 2, 2, 4, 6, 1] => False # [2, 2, 4, 6]
[1, 2, 2, 2, 2, 2] => True # [2, 2, 2, 2, 2]
[1] => False # []
0 голосов
/ 19 ноября 2018

Редактировать: извинения за неправильное прочтение. Теперь он рекурсивный, хотя у меня возникают проблемы с выяснением, зачем вам это нужно.

Вы просматриваете список, пока не найдете n числа, где modulo 2 == 0. % - это оператор python modulo.

def find_numbers(l, i=0, count=0):
  try:
    if count == 5:
      return True
    elif l[i] % 2 == 0:
      return find_numbers(l, i=i+1, count=count+1)
    else: 
      return find_numbers(l, i=i+1, count=count)
  except IndexError as e:
    return False
print(find_numbers([1, 2, 4, 6, 3, 1])) # False
print(find_numbers([1, 1, 1, 1, 1, 1])) # False
print(find_numbers([1, 2, 2, 4, 6, 1])) # False
print(find_numbers([1, 2, 2, 2, 2, 2])) # True
print(find_numbers([1])) # False

Это вернет True, если и только если x удовлетворяет условию достаточное количество раз. Он выдаст ошибку, если выполнит итерацию к индексу в списке, где находится неоперабельное значение (например, a str). Он будет ловить IndexError, чтобы он мог принимать короткие списки, как в последнем примере.


Объяснение: Важно помнить, что последний случай разветвляет стек вызовов. Поэтому, если последний вызов возвращает True | False, и каждый последующий вызов до этого может возвращать только ошибку (str случай ввода, который я упомянул) или True | False | Another recursive call, тогда мы можем ожидать, что последний случай будет одним из них.

Еще одна приятная вещь в этом заключается в том, что он останавливается, когда находит пятое совпадение, поэтому, я думаю, вы сохраняете итерации по списку дальше. Возможно, именно поэтому ОП хотела рекурсию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...