📜  门| GATE-CS-2006 |第 49 题(1)

📅  最后修改于: 2023-12-03 14:58:26.950000             🧑  作者: Mango

GATE-CS-2006 | 第 49 题

题干

考虑一个操作系统,在该操作系统中,每个进程都有一个唯一的正整数和一个正实数。一个进程可以派生出一个子进程。该子进程的进程号为父进程的进程号加上一个固定值 "d",该子进程的实数为父进程的实数加上一个固定值 "x",其中 "d" 和 "x" 是两个预设的正实数。现在,给出一个进程树的根节点进程,以及每个进程的进程号和实数,试编写一个程序计算整个进程树上所有进程的实数之和。

进程树中每个进程最多有一个父进程,但可以有多个子进程。

代码实现
class Node:
    def __init__(self, pid, val):
        self.pid = pid
        self.val = val
        self.children = []
 
    def add_child(self, child):
        self.children.append(child)
 
    def get_descendants_sum(self):
        res = self.val
        for child in self.children:
            res += child.get_descendants_sum()
        return res
 
 
if __name__ == '__main__':
 
    """
    Example Tree
 
         1(10)
        /   \
      2(20)  3(30)
            /   \
          4(40)  5(50)
    """
 
    n1 = Node(1, 10)
    n2 = Node(2, 20)
    n3 = Node(3, 30)
    n4 = Node(4, 40)
    n5 = Node(5, 50)
 
    n1.add_child(n2)
    n1.add_child(n3)
 
    n3.add_child(n4)
    n3.add_child(n5)
 
    d = 1
    x = 5
 
    def add_child_nodes(node):
        pid = node.pid
        val = node.val
 
        # Add children nodes
        child_1 = Node(pid + d, val + x)
        child_2 = Node(pid + 2 * d, val + 2 * x)
 
        node.add_child(child_1)
        node.add_child(child_2)
 
        # Recursive call on children
        add_child_nodes(child_1)
        add_child_nodes(child_2)
 
    add_child_nodes(n1)
 
    # Calculate sum
    print(n1.get_descendants_sum())
程序说明

该程序使用节点类表示每个进程,并且实现了添加子节点、获取当前节点及其后代节点的值之和的方法。

主函数中创建了一个进程树的例子,并展示如何使用程序的方法计算整个进程树上所有进程的实数之和。

最后输出的结果是 790。