在Python中递归导航员工树

时间:2013-11-07 16:29:00

标签: python recursion

我最近提出了这个问题,但我并不擅长编写递归函数。你会如何解决它?

您的公司结构如下:

#          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

4 个答案:

答案 0 :(得分:5)

  def reportsTo(eid, mid):
       m2 = company[eid]
       if m2 == "NULL": return False
       return m2 == mid or reportsTo(m2, mid)

答案 1 :(得分:3)

制作递归函数的第一步是确定基本情况。这有两个。

  1. 员工直接向经理报告:return true。
  2. 员工的经理是空的:返回false,因为我们已经到了CEO。
  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),函数就不会递归。