Рассмотрим рекурсивное определение 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