Редактировать: извинения за неправильное прочтение. Теперь он рекурсивный, хотя у меня возникают проблемы с выяснением, зачем вам это нужно.
Вы просматриваете список, пока не найдете 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
, тогда мы можем ожидать, что последний случай будет одним из них.
Еще одна приятная вещь в этом заключается в том, что он останавливается, когда находит пятое совпадение, поэтому, я думаю, вы сохраняете итерации по списку дальше. Возможно, именно поэтому ОП хотела рекурсию.