【发布时间】:2018-02-24 19:41:21
【问题描述】:
我正在尝试找出一种方法来查找根项及其相关性。
就我而言,我有一个游戏的“可制作物品”列表。
例如:
- 原木
- 木板
- 木墙
所有这些项目都有所谓的parents 和children。
这些是包含itemID 的简单元组数组(我可以将其转换为实际的Item 对象和amount 值。
例如:
typealias ParentTuple = (id: Int, amount: Float)
typealias ChildrenTuple = (id: Int, amount: Float)
var woodLog = Item(id: 1,
name: "Wood Log",
parents: [],
children: [ChildrenTuple(id: 2, amount: 2)]
)
var woodPlank = Item(id: 2,
name: "Wood Plank",
parents: [ParentTuple(id: 1, amount: 0.5)],
children: [ChildrenTuple(id: 3, amount: 4)]
)
var woodStick = Item(id: 3,
name: "Wood Stick",
parents: [ParentTuple(id: 2, amount: 0.25)],
children: []
)
如您所见,一根原木可以制作 2 个木板,而您需要 0.5 个原木才能制作 1 个木板。 (当然,稍后我会将每个值限制为下一个完整整数)。
因此,按照 1 个原木的逻辑,您应该能够制作 8 个木棍。
- 1x 原木 ->
- 2x 木板 ->
- 8x 木棒
现在我需要知道的是,如果我想以制作 32 根木棒为例,我需要多少原木?
我设法递归地返回了一个项目的所有rootItems(没有任何parents的项目)的列表,如下所示:
func rootItems() -> [ParentTuple] {
guard self.isCraftable else { return [ParentTuple(self.id, amount: 1)] }
var rootItems = [ParentTuple]()
for (_, parentTuple) in self.parentIDs.enumerated() {
guard let parentItem = Item.item(forID: parentTuple.id) else {
assertionFailure()
return [ParentTuple(self.id, amount: 1)]
}
if parentItem.isRootItem {
rootItems.append(ParentTuple(id: parentTuple.id, amount: parentTuple.amount))
} else {
rootItems.append(contentsOf: parentItem.rootItems())
}
}
return rootItems
}
这很好用。我只是坚持如何让amount 工作。
理论上,对于每个递归调用,我只需要将当前的 parentTuple.amount 与下一个相乘(在我们的示例中:0.25 * 0.5 = 0.125 --> 1/8 Wood Log for 1 Wood Branch)
我的模型可能不适合该任务吗,我是否遗漏了什么?
【问题讨论】:
标签: swift recursion computer-science