你受聘开发Noble Knots,专为贵族打造的最热门新交友应用!经过几个世纪的王室通婚,事情变得……_复杂_了。为了避免出现_哎呀,我们是双胞胎_这样的情况,你的任务是构建一个系统,用来检查两个人的血缘有多近。
Noble Knots 的灵感来自冰岛的“Islendinga-App”,它背后有一个数据库,记录了自冰岛定居以来冰岛人之间所有已知的亲缘关系。你的算法将判断王室家谱中两个人之间的亲疏程度。
你的应用能促成一段完美的姻缘吗?
你的任务是确定家谱中两个人之间的分隔度。这类似于流行文化中的那个说法:每位好莱坞演员都与 Kevin Bacon 相隔不超过六度。
给定下面这棵家谱树:
┌──────────┐ ┌──────────┐ ┌───────────┐
│ Helena │ │ Erdős ├─────┤ Shusaku │
└───┬───┬──┘ └─────┬────┘ └────┬──────┘
┌───┘ └───────┐ └───────┬───────┘
┌─────┴────┐ ┌────┴───┐ ┌─────┴────┐
│ Isla ├─────┤ Tariq │ │ Kevin │
└────┬─────┘ └────┬───┘ └──────────┘
│ │
┌────┴────┐ ┌────┴───┐
│ Uma │ │ Morphy │
└─────────┘ └────────┘
Tariq 和 Uma 之间的分隔度是 2(Tariq → Isla → Uma)。 Isla 和 Kevin 之间没有已知关系,因为给定数据中两者没有连接。 Uma 和 Isla 之间的分隔度是 1。
Isla 和 Tariq 是兄弟姐妹,他们的分隔度是 1。 同样,按照这个实现,你和你父亲的兄弟之间的分隔度会是 2。
本练习的测试要求你用 Python 将解答实现为一个RelativeDistance class。
如果你不熟悉 Python 中的class,可以从 classes 和 Python 官方文档中的classes 入手。
RelativeDistance应该使用family_tree来初始化(详见__init__()),family_tree是一个字典,其中keys是个体,values是该个体所有子代的list。
你还需要实现一个degree_of_separation方法,用来返回person_a和person_b之间的亲疏程度,他们都是传入的家族树中的个体。
我们为你提供了一个__init__特殊方法的桩实现,用于创建RelativeDistance类的实例,同时也提供了degree_of_separation方法的桩。
首先,你需要在__init__中为self(即实例)添加一个合适的属性,用来表示family_tree数据。
然后,你就可以在degree_of_separation方法中加入自己的逻辑,计算出person_a和person_b之间的亲疏程度。
有时需要抛出异常。 抛出异常时,你应该始终附上有意义的错误消息,指出错误的来源。 这能让代码更易读,对调试也有很大帮助。 如果你已经知道错误来源属于某种类型,可以选择抛出内置错误类型中的一种,但同样应该附上有意义的消息。
本练习要求你使用 raise 语句来“抛出”多个ValueError。
在第一种情况下,当传给RelativeDistance.degree_of_separation方法的人中有一个或两个不在家族树里时,你需要抛出一个ValueError。
# Example when Person A is not in the tree.
raise ValueError("Person A not in family tree.")
如果两个人都在家族树中,但按规则他们之间不存在有效的连接,你需要抛出一个ValueError。
# Example when there are no valid connections.
raise ValueError("No connection between person A and person B.")
只有当你既raise了预期的exception类型,又附上了预期的消息,测试才会通过。
请仔细查看测试及其预期结果,因为本说明并不全面。