Найти максимум или минимум по отдельности легко. Что сложно, так это найти максимальное и минимальное значения с помощью рекурсивных вызовов. Хвостовая рекурсия как раз для этого (поддерживает и обновляет состояние переменных с помощью рекурсивных вызовов) и обычно проста для записи:
def findminmax(L):
def inner(L1, min, max):
if L1 == []:
return (min, max)
elif L1[0] > max:
return inner(L1[1:], min, L1[0])
elif L1[0] < min:
return inner(L1[1:], L1[0], max)
else:
return inner(L1[1:], min, max)
return inner(L[1:], L[0], L[0])
findminmax([2,1,4,9,4.5])
# => (1, 9)
Нет необходимости в присвоении и индексации необычного списка. Требуется только самая основная операция со списком. Структура рекурсии ясна и очень стандартна (очевидно, см. Базовый случай, сокращение и рекурсивный вызов функции), и код также очень читабелен как обычный английский.
Обновление
Небольшая модификация для обработки строкового ввода и пустого списка или строкового ввода:
def findminmax(LS):
def inner(LS1, min, max):
if not LS1:
return (min, max)
elif LS1[0] > max:
return inner(LS1[1:], min, LS1[0])
elif LS1[0] < min:
return inner(LS1[1:], LS1[0], max)
else:
return inner(LS1[1:], min, max)
try:
return inner(LS[1:], LS[0], LS[0])
except IndexError:
print("Oops! That was no valid input. Try again...")
findminmax([2,1,4,9,4.5])
# => (1, 9)
findminmax([2])
# => (2, 2)
findminmax('txwwadga')
# => ('a', 'x')
findminmax('t')
# => ('t', 't')
findminmax([]) # empty list
# => Oops! That was no valid input. Try again...
findminmax('') # empty string
# => Oops! That was no valid input. Try again...