Для всех комбинаций здесь есть идея.Циклы можно оптимизировать дальше
import itertools
def change(target):
nums = [5, 7]
min_len = int(target / 7)
max_len = int(target / 5) + 1
res = []
for len_ in range(min_len, max_len):
r = itertools.combinations_with_replacement(nums, len_)
for item in r:
if sum(item) == target:
res.append(item)
return res
И немного оптимизировать.Соберите все комбинации в пределах возможного диапазона и отфильтруйте те с суммой == target.
import itertools
def change(target):
nums = [5, 7]
min_len = int(target / 7)
max_len = int(target / 5) + 1
res = []
for len_ in range(min_len, max_len):
res += (list(itertools.combinations_with_replacement(nums, len_)))
return list(filter(lambda x: sum(x) == target, res))
Вывод, который содержит все возможные комбинации для цели = 70
[(7, 7, 7, 7, 7, 7, 7, 7, 7, 7), (5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7), (5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5)]
Без какой-либо петли в стиле FP.Сокращение всех возможных комбинаций в один список и фильтрация правильных элементов этого списка в ответ.
import itertools
from functools import reduce
def change(target):
nums = [5, 7]
min_len = int(target / 7)
max_len = int(target / 5) + 1
res = reduce(lambda x, y:
x + (list(itertools.combinations_with_replacement(nums, y))),
range(min_len, max_len), [])
return list(filter(lambda x: sum(x) == target, res))