5

如果您曾经玩过我的世界,以下内容会更有意义。由于你们中的许多人没有,我会尽力解释它

我正在尝试编写一个递归函数,该函数可以找到从我的世界食谱平面文件中制作任何我的世界物品的步骤。这个我真的难住了。

平面文件有点长,所以我将它包含在这个要点中。

def getRecipeChain(item, quantity=1):
    #magic recursive stuffs go here

所以基本上我需要查找第一个食谱,然后查找第一个食谱的所有组件的食谱,依此类推,直到你找到没有食谱的项目。每次我需要将食谱附加到一个列表中,这样我就会得到一个关于制作物品顺序的指令集。

所以这是我现在拥有的功能(那个不起作用)

def getRecipeChain(name, quantity=1):
    chain = []

    def getRecipe(name1, quantity1=1):
        if name1 in recipes:
            for item in recipes[name1]["ingredients"]["input"]:
                if item in recipes:
                    getRecipe(item, quantity1)
                else:
                    chain.append(item)

    getRecipe(name, quantity)
    return chain

这是我想要的理想输出。它是一个字典,其中存储了项目名称和数量。

>>> getRecipeChain("solar_panel", 1):
{"insulated_copper_cable":13, "electronic_circuit":2, "re_battery":1, "furnace":1, "machine":1, "generator":1, "solar_panel":1}

所以问题是,我该怎么做?

我知道在这里要求人们为你工作是不受欢迎的,所以如果你觉得这有点太接近你只是为我做编码,那就这么说吧。

4

2 回答 2

3

这可以使用collections.Counter支持加法的 优雅地解决:

from collections import Counter

def getRecipe(name, quantity=1):
  if not name in recipes: return Counter({name: quantity})

  subitems = recipes[name]["ingredients"]["input"]
  return sum((getRecipe(item, quantity) for item in subitems), 
             Counter())

print repr(dict(getRecipe("solar_panel")))
# => {'copper': 39, 'refined_iron': 10, 'glass': 3, 
#     'rubber': 78, 'cobblestone': 8, 'tin': 4, 
#     'coal_dust': 3, 'nothing': 10, 'redstone': 6}
于 2012-03-07T00:29:22.443 回答
1

我认为问题是2倍。首先,您需要在对 getRecipe() 的递归调用中将项目附加到链中。其次,我认为这两个功能不必要地使事情复杂化。我认为只有内在的应该做。像这样的东西就是你要找的东西。我还没有测试过它,但它应该足够接近让你开始走上正轨。

def getRecipe(name, quantity=1):
    chain=[];
    if name in recipes:
        for item in recipes[name]["ingredients"]["input"]:
            if item in recipes:
                chain.append(getRecipe(item, quantity))
            else:
                chain.append(item)
    return chain

编辑:评论填补了我对python知识的缺乏,所以这是一个更好的解决方案。

from collections import Counter
def getRecipe(name, quantity=1, count=Counter()):
    if name in recipes:
        for item in recipes[name]["ingredients"]["input"]:
            if item in recipes:
                getRecipe(item, quantity,counter)
            else:
                counter[item]+=quantity
    return counter
于 2012-03-07T00:18:38.327 回答