【问题标题】:Tree node counter algorithm: please explain this recursion step by step树节点计数器算法:请逐步解释此递归
【发布时间】:2020-01-22 21:39:03
【问题描述】:

给定以下树:

#                     'Mobs'
#             /          |           \
#     'NPC'          'Enemies'         'Heroes'
#     /           /       |      \            \
# 'Andrew'    'Slime'  'Goblin'  'Dragon'      'Human'
#                                     \
#                                     'Wyrm'

tree = ('Mobs', [('NPC', [('Andew', [])]), ('Enemies', [('Slime', []), ('Goblin', []), ('Dragon', [('Wyrm', [])])]), ('Heroes', [('Human', [])])])

每个节点都是一个元组,由 [0] 处的字符串和 [1] 处的可能子节点列表组成。 以下函数成功返回计数:

def how_many(node):
    count = 1                                   
    for i in node[1]:                           
        count = count + how_many(i)             
    return count

我试图了解它的确切作用。有人向我解释说,我需要将自己想象成“堆栈”以了解递归是如何工作的。让我试着表达我的理解: 由于程序在第一次调用自己时没有所有信息,因此它足够强大,可以暂停所有操作,将它们堆叠起来,以便保留它们将执行的顺序,一直持续到它到达了基本情况——当树节点没有子节点时在我们的函数中——并在我们的计数变量中产生正确的堆积值,以便在循环完成时它可以返回它。

我说的对吗? 如果可能的话,我需要有人用文字逐步解释该功能的作用。

【问题讨论】:

    标签: python recursion tree


    【解决方案1】:

    基本上你可以想到盒子。 假设我们要数箱子。

    1. 你有一个大盒子小怪。你有一个盒子count = 1你的递归开始。

    2. 你打开盒子。你会看到三个小盒子(NPC、敌人、英雄)。 for i in node[1]

    3. 你拿第一个箱子(NPC)问我NPC有多少箱子。 count = count + how_many(i)

    4. 你有 1 个盒子 (NPC) count = 1

    5. 你打开盒子,看到一个更小的盒子 (Andrew) for i in node[1]

    6. 你再次拿起盒子,问我安德鲁有多少盒子。 count = count + how_many(i)

    7. 您有 1 个盒子(安德鲁)。 count = 1

    8. 您打开盒子并没有看到任何更小的盒子。你不进入for循环for i in node[1]

    9. 你返回的计数是 1。

    10 你回到盒子之前(NPC)你从how_many(i)(来自安德鲁)得到 1 个返回并有 1 个表格 NPC。 1 + 1 = 2

    11 NPC 中没有其他框,因此您退出 for 循环并返回计数为 2。

    1. 你回到了你的第一个盒子(Mob)。您从 Mob 框中获得 2 并获得 1。 1 + 2 = 3

    2. 您仍处于 for 循环中并选中下一个框(敌人)。

    3. 简而言之,您也可以这样做:敌人将返回 5(敌人、史莱姆、地精、龙、巨龙)。你数3 + 5 = 8

    4. 最后一个盒子还在(英雄)

    5. 简而言之:Heroes 将返回 2(Heroes,Human),你数 8 + 2 = 10

    6. 最后返回的是count = 10

    结果 = 10

    【讨论】:

    • 感谢您提供如此彻底和完整的答案!
    【解决方案2】:

    这是一个更简单的递归用例:阶乘函数n! = n * (n-1) *... * 2 * 1

    def factorial(n):
        if n == 0:
            result = 1
        else: result = n * factorial(n-1)
        return result
    
    print(factorial(2))
    

    这里发生了什么?

    • factorial(2) 被调用。它进入else 条件,然后等待factorial(1) 结果
    • factorial(1) 被调用。它进入else 条件,然后等待factorial(0) 结果
    • factorial(0) 被调用。这次它进入if 条件。返回结果1
    • 我们回到函数factorial(1),在那里我们可以求解result = n * factorial(n-1)。返回结果 1*1 = 1。
    • 我们终于回到函数factorial(2),在那里我们可以解决result = n * factorial(n-1)这一行。返回结果 1*1*2 = 2。
    • 它打印 2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 2018-10-30
      • 2021-08-15
      • 2015-08-31
      • 2014-08-12
      • 2011-05-15
      • 2011-08-19
      相关资源
      最近更新 更多