【问题标题】:Using recursion to find max number of nodes in base 7 tree使用递归查找base 7树中的最大节点数
【发布时间】:2016-05-19 13:45:13
【问题描述】:

第一次在这里发帖。自学python,并对如何使用递归解决以下问题感到好奇。 我们有一家公司,每位员工最多有 7 份报告。给定组织的深度 x,求包括 CEO 在内的最大员工人数。这基本上是找到二叉树的最大节点数,除了以 2 为基数,我们以 7 为基数。

我能够使用公式 (b**(d+1))/(b-1) 线性求解,其中 b 是基数,d 是树的深度。

def MaxNodes(d):
minions = ((7**(d+1)) - 1) / 6
return minions

我也迭代解决了:

def answer(x):
    minions = 1
    for levels in range(x):
        if (levels == 0):
            minions = 7
        else:
            minions += (minions * 7)
    return minions + 1

所以我们在级别 0 中几乎有值 1,从级别 1 开始,我们从值 7 开始,并不断乘以 7 并添加到之前的结果: 1 + (7x1) + (7x7) + (49x7) ... 很抱歉,如果这很简单,但我不知道如何递归地解决这个问题。

提前感谢您的帮助。

【问题讨论】:

  • MaxNodesanswer 不要做同样的事情......
  • 未经测试且不递归:sum([7**i for i in range(depth)])
  • @KlausD。这个问题已经有了确切的公式:((7**(depth+1)) - 1) // 6,你不需要在sum() 中使用[]
  • 你是对的@TadhgMcDonald-Jensen,第二次看我不知道为什么我在那里加了一个加法,应该一直乘以 7。谢谢你指出这一点。

标签: python recursion


【解决方案1】:

这是一个简单的递归实现:

def nodes(d):
    if d == 0:
        return 1
    else:
        return 1 + 7 * nodes(d - 1)

print [nodes(i) for i in range(5)] # [1, 8, 57, 400, 2801]

深度作为参数传递,当它达到 0 时,函数返回 1 从而停止递归。否则,该函数将调用自身以获取较低级别的数字,将结果乘以 7 并添加当前级别。

【讨论】:

  • 谢谢!现在我看到它是有道理的。看来我需要大量练习。
【解决方案2】:

如果要递归查找7**x

def max_siblings(depth, degree=7, total=1):
    """How many siblings maximum at the given *depth*."""
    return max_siblings(depth-1, degree, total*degree) if depth else total

如果要递归查找((7**(depth+1)) - 1) // 6

def max_nodes(depth, degree=7, total=1):
    return max_nodes(depth-1, degree, total+max_siblings(depth)) if depth else total

例子:

for depth in range(5): 
    print(max_nodes(depth))

输出:

1
8
57
400
2801

您可以使用 @lru_cache(maxsize=None) decorator 缓存 max_siblings() 计算

【讨论】:

  • 是否有理由将total 值向上传递调用树,而不是对返回值进行数学运算?例如。 def max_siblings(depth, degree=7): return max_siblings(depth-1, degree) * degree if depth else 1def max_nodes(depth, degree=7): return max_nodes(depth-1, degree) + max_siblings(depth) if depth else 1)? Cpython 至少不做任何尾调用消除。
  • @Blckknght:this is the reason。相关discussion。这是TCO decorator
  • 我喜欢使用默认值来缩短实现。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 2013-11-04
相关资源
最近更新 更多