У меня есть следующий код. Это так просто, как я могу это сделать. Кто-нибудь знает хитрый способ превратить эту рекурсию в al oop?
Проблема в том, что я могу столкнуться с лимитом отказов. Я думал о некоторых способах переписать его, но они совсем не симпатичны.
Моя самая приятная мысль на данный момент состоит в том, что я мог бы сделать это в какой-то форме хвостовой рекурсии, но я не уверен как это сделать.
def blackbox(c, i): #This is a different function in production
if i > 5:
return range(0,1)
else:
return range(0,c+i)
def recurse(c, length):
if length == 0:
return [[]]
return [l + [j] for j in blackbox(c, length) for l in recurse(c - j, length - 1)]
Пример: recurse(6, 1000)
выдает ошибку, превышающую предел рекурсии.
Классный, в основном бесполезный факт: использование range(i, c + 1)
для черный ящик возвращает все списки длиной length
с суммой не более c
.
РЕДАКТИРОВАТЬ: я знаю, что могу запомнить код, но это не фиксирует ограничение рекурсии. В этом примере запоминание очень помогает скорости, но в моей ситуации это не так, поэтому меня это не касается.
РЕДАКТИРОВАТЬ 2: Обновлено blackbox
, поэтому значение recurse(6,1000)
равно разумно.