MST
星途 面试题库

面试题:复杂场景下的Fortran递归函数设计

在一个具有树状结构的数据模型中,每个节点包含一个整数值和指向子节点的指针(在Fortran中可通过自定义数据类型结合数组索引模拟实现)。编写一个Fortran递归函数,计算以某节点为根的子树中所有节点值的乘积。同时,要考虑函数的通用性,能够处理不同拓扑结构的树,并且对内存使用和性能有优化策略。
29.2万 热度难度
编程语言Fortran

知识考点

AI 面试

面试题答案

一键面试
module tree_module
    implicit none

    type :: tree_node
        integer :: value
        integer, allocatable :: children(:)
    end type tree_node

    type, extends(tree_node) :: tree
        integer :: root_index
    contains
        procedure :: product_subtree
    end type tree
contains
    recursive function product_subtree(this, index) result(prod)
        class(tree), intent(in) :: this
        integer, intent(in) :: index
        integer :: prod, i

        prod = this%nodes(index)%value
        if (allocated(this%nodes(index)%children)) then
            do i = 1, size(this%nodes(index)%children)
                prod = prod * product_subtree(this, this%nodes(index)%children(i))
            end do
        end if
    end function product_subtree
end module tree_module

program test_tree
    use tree_module
    implicit none
    type(tree) :: my_tree
    integer :: i, num_nodes

   ! 假设已经初始化了树结构,这里简单示例
    num_nodes = 5
    allocate(my_tree%nodes(num_nodes))
    my_tree%nodes(1)%value = 2
    my_tree%nodes(2)%value = 3
    my_tree%nodes(3)%value = 4
    my_tree%nodes(4)%value = 5
    my_tree%nodes(5)%value = 6
    allocate(my_tree%nodes(1)%children(2))
    my_tree%nodes(1)%children = [2, 3]
    allocate(my_tree%nodes(2)%children(2))
    my_tree%nodes(2)%children = [4, 5]
    my_tree%root_index = 1

    print *, '以根节点为起始的子树所有节点值的乘积: ', my_tree%product_subtree(my_tree%root_index)
end program test_tree
  1. 模块部分
    • 定义了tree_node类型,包含节点值value和指向子节点的数组children
    • 定义了tree类型,它继承自tree_node,并添加了root_index来标识树的根节点。同时包含了product_subtree递归函数。
  2. 递归函数product_subtree
    • 计算以index所指节点为根的子树所有节点值的乘积。
    • 首先将当前节点值赋给prod,然后检查当前节点是否有子节点。如果有,递归计算每个子节点为根的子树的乘积,并累乘到prod中。
  3. 主程序部分
    • 简单初始化了一个树结构,并调用product_subtree函数计算以根节点为起始的子树所有节点值的乘积。

优化策略

  • 内存使用:通过动态分配children数组,避免了固定大小数组可能带来的内存浪费。当节点没有子节点时,children数组不会分配内存。
  • 性能:递归函数简洁明了,在处理树状结构时符合直观逻辑。由于Fortran编译器通常会对递归函数进行较好的优化,在处理一般规模的树时性能可以接受。对于大规模树,可以考虑使用栈模拟递归的方式,避免递归过深导致栈溢出问题,但这会增加代码的复杂性。