Во-первых, как отслеживать количество необходимых ингредиентов, например, quadruple_axe нужно всего 4 палочки.
Ваш инстинкт использования словаря для сбора количества ингредиентов хорош :
dict2={}
#define empty dictionary to store count of raw ingredients
Но, пожалуйста, поместите комментарий перед строкой, о которой он комментирует, а не после.
Во-вторых, когда мы прекращаем повторение, то есть каков базовый случай здесь?
Вы работаете с сырьем напрямую, вы используете рецепты по субрецептам. Таким образом, отречение естественным образом прекращается, когда вы исчерпали все вспомогательные рецепты - вам не нужно явно проверять его.
Я рекомендую вам перестать думать в терминах dict1
и dict2
как а также i
, j
и k
и программа на языке проблемы. Я также предлагаю вам использовать defaultdict
для сбора окончательного списка ингредиентов, преобразовав его в общий c dict
в конце, если вы чувствуете необходимость. Но это необязательно и просто упрощает код:
from collections import defaultdict
recipes = {
'axe': {'stick': 1, 'rock': 1, 'tape': 1},
'double_axe': {'axe': 2, 'tape': 1},
'quadruple_axe': {'double_axe': 2, 'tape': 1, 'rock': 2}
}
raw_ingredients = {'rock', 'stick', 'tape'}
def count_raw_ingredients(recipe):
ingredients = defaultdict(int)
for ingredient, amount in recipes[recipe].items():
if ingredient in raw_ingredients:
ingredients[ingredient] += amount
else:
for subingredient, subamount in count_raw_ingredients(ingredient).items():
ingredients[subingredient] += amount * subamount
return dict(ingredients)
print(count_raw_ingredients('quadruple_axe'))
ВЫХОД
> python3 test.py
{'stick': 4, 'rock': 6, 'tape': 7}
>