我最近提出了这个问题,但我并不擅长编写递归函数。你会如何解决它?
您的公司结构如下:
# employee: manager
company = {
'17': '15',
'16': '15',
'10': '5',
'15': '10',
'5': '4',
'4': 'NULL'
}
每个号码都是该人的ID。 Person 4是CEO,因为没有经理,所以有一个NULL值。
你怎么能写一个返回的递归函数reportsTo(eid, mid)
:
reportsTo('17', '4')
- > True
reportsTo('15', '16')
- > False
答案 0 :(得分:5)
def reportsTo(eid, mid):
m2 = company[eid]
if m2 == "NULL": return False
return m2 == mid or reportsTo(m2, mid)
答案 1 :(得分:3)
制作递归函数的第一步是确定基本情况。这有两个。
如果我们到目前为止,我们使用公司[e]而不是原始员工返回对同一功能的调用。它上升直到达到其中一个基本情况。
这仅适用于员工只有一名直接经理的情况。如果还有更多,它会变得更复杂。
答案 2 :(得分:1)
如果我理解你想做什么,你可以做这样的事情(伪代码):
function reportsTo(eid, mid):
if company[eid] is mid # base case number 1
return True
else if company[eid] is null # base case number 2
return False
else
return reportsTo(company[eid], mid)
如果你想了解递归函数,我会尝试实现非常琐碎的事情,但是递归。例如,创建一对递归函数,一个检查数字是否为偶数,另一个检查是否为奇数。
编辑:
的Python:
def reportsTo(eid, mid):
if company[eid] == mid: # base case number 1
return True
elif company[eid] is None: # base case number 2
return False
else
return reportsTo(company[eid], mid)
(我将首席执行官的经理改为None
,而不是将'NULL'
更改为字符串,因为这对我来说似乎更好。)
可替换地:
def reportsTo(eid, mid):
if eid in company:
return False
return (eid == mid) or (reportsTo(company[eid], mid))
答案 3 :(得分:1)
这是一个使用递归的快速解决方案:
def reportsTo(e, m):
if e == 'NULL':
return False
assert e in company
if m == company[e]:
return True
else:
return reportsTo(company[e], m)
编辑虽然上面的代码在技术上是正确的,但尝试改进它是一个很好的练习。
根据其他人的评论:
company[e]
会引发KeyError
,因此可以删除此代码。company[e]
可能会被多次计算。为了速度和可读性,将其分配给本地变量。e
'NULL'
的检查可以转移到检查company[e]
是否为'NULL'
;这可以保存一个函数调用。if
- else
可以变成or
,利用or
是懒惰的事实,并且左边的参数是严格的,即它不会评估它正确的参数,因此只要左参数为True
),函数就不会递归。