Рассмотрим рекурсивное определение all
:
def all(L):
if L:
return L[0] and all(L[1:])
else:
???
Если каждый элемент в L
истинен, то должно быть истинным, что первый элемент в L
истинен, и что all(L[1:])
истинен. Это легко увидеть для списка с несколькими элементами, но как насчет списка с одним элементом. Ясно, что каждый элемент верен, если истинен только один элемент, но как в этом случае работает наша рекурсивная формулировка? Определение all([])
как истинного заставляет алгоритм работать.
Другой способ взглянуть на это так: для любого списка L
, для которого all(L)
неверно верно, мы должны иметь возможность идентифицировать по крайней мере один элемент, a
, который неверен. Однако такого a
в L
нет, когда L
пусто, поэтому мы вправе сказать, что all([])
истинно.
Те же аргументы работают для any
. Если any(L)
истинно, мы должны быть в состоянии идентифицировать по крайней мере один элемент в L
, который является истинным. Но так как мы не можем для пустого списка L
, мы можем сказать, что any([])
ложно. Рекурсивная реализация any
подтверждает это:
def any(L):
if L:
return L[0] or any(L[1:])
else:
return False
Если L[0]
истинно, мы можем вернуть true, даже не выполняя рекурсивный вызов, поэтому предположим, что L[0]
ложно. Единственный способ достичь базового случая — это если ни один элемент L
не является истинным, поэтому мы должны вернуть False
, если мы его достигнем.
26.10.2013