Бесконечная рекурсия в функции Python, если аргумент слишком длинный
Я написал эту рекурсивную функцию, которая возвращает наибольшее значение в списке целых чисел:
def max_r(l: [int]) -> int: if len(l) == 1: return l[0] else: return l[0] if max_r(l[1:]) < l[0] else max_r(l[1:])
Вызов max_r([1,4,3,2,3,4,89,2,30,1]
возвращает 89
, но вызывает функцию в более длинном списке:
max_r([96, 84, 87, 81, 94, 74, 65, 42, 45, 76, 5, 37, 86, 8, 46, 54, 62, 63, 35, 85, 16, 23, 18, 57, 51, 90, 58, 33, 47, 10, 64, 49, 67, 29, 71, 30, 9, 99, 75, 3, 97, 32, 59, 25, 27, 72, 61])
приводит к бесконечной рекурсии. Зачем?
- Функция, вызывающая неправильные значения
- Python: базовый регистр рекурсивной функции
- Рекурсивная функция для глубинного поиска
- Сколько комбинаций возможно?
- python 3.2 – найти второе наименьшее число в списке, используя рекурсию
Это не бесконечно рекурсивно, но вы делаете один и тот же рекурсивный вызов дважды, когда вам это не нужно. Кажется, достаточно быстро завершить со следующим изменением:
def max_r(l: [int]) -> int: if len(l) == 1: return l[0] else: result = max_r(l[1:]) return l[0] if result < l[0] else result
Это не просто вызов функции рекурсивно в два раза больше, я не уверен в точном темпе роста, но, похоже, экспоненциально, так как каждый дополнительный рекурсивный вызов будет делать более экстренные рекурсивные вызовы.
- Использование функции print () внутри рекурсивных функций в Python3
- обработка строкой строки с рекурсивной функцией
- Рекурсивная интеграция
- ** recurPower ** Я понял, но я этого не понимаю
- Рекурсия Python на _getattr_ в моем декораторе класса
- Как найти отношения между объектами
- Взаимно рекурсивные сопрограммы с асинчио
- JSON, списки и рекурсия в python
- Python – использование общей переменной в рекурсивной функции