Прежде всего семантика ваших имен для стратегии use-it-or-lose-it обратная. «Использовать это» означает, что данный элемент учитывается в вашем общем результате. «Lose it» означает, что вы просто перечитываете оставшуюся часть списка без учета текущего элемента. Поэтому я бы начал с переключения этих имен. А также вы должны быть отбрасывая текущий элемент в рекурсивном вызове, используете ли вы его:
loseIt = change(amount,coins[1:])
useIt = change(amount-coins[0], coins[1:]) + 1
Теперь, когда мы исправили, что на ваш вопрос о передаче результата вниз. Вы можете взять min
кортежей или списков, и он начнется с сравнения первых элементов каждого из них и продолжит работу над последовательными элементами, если не будет найдено определенного min
. Например, если вы передаете вокруг списка с целым числом и списком:
>>> min([2, [1,2]], [3, [0,2]])
[2, [1, 2]]
Вы также можете комбинировать любое количество элементов в этой форме с выражением, как это:
>>> [x+y for x,y in zip([2, [1,2]], [3, [0,2]])]
[5, [1, 2, 0, 2]]
но ваш случай проще, так как вы всегда просто комбинируя 2 из них, так что можно записать больше как:
[useIt[0] + 1, useIt[1] + [coins[0]]]
Обратите внимание, что первый элемент представляет собой целое число, а второй список.
в вашем случае реализации этой идеи будет выглядеть примерно так:
def change(amount,coins):
if amount==0:
return [0, []]
if coins== [] or amount < 0:
return [float('inf'), []]
else:
loseIt = change(amount, coins[1:])
useIt = change(amount - coins[0], coins[1:])
# Here we add the current stuff indicating that we "use" it
useIt = [useIt[0] + 1, useIt[1] + [coins[0]]]
return min(useIt,loseIt)
Так что вы хотите распечатать возвращаемое значение 'мин (useIt, loseIt)'? – Li357
Можете ли вы привести примеры входов и выходов этой функции? –
Если вы хотите что-то _display_, попробуйте 'print()'. –