面试题答案
一键面试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
- 模块部分:
- 定义了
tree_node
类型,包含节点值value
和指向子节点的数组children
。 - 定义了
tree
类型,它继承自tree_node
,并添加了root_index
来标识树的根节点。同时包含了product_subtree
递归函数。
- 定义了
- 递归函数
product_subtree
:- 计算以
index
所指节点为根的子树所有节点值的乘积。 - 首先将当前节点值赋给
prod
,然后检查当前节点是否有子节点。如果有,递归计算每个子节点为根的子树的乘积,并累乘到prod
中。
- 计算以
- 主程序部分:
- 简单初始化了一个树结构,并调用
product_subtree
函数计算以根节点为起始的子树所有节点值的乘积。
- 简单初始化了一个树结构,并调用
优化策略:
- 内存使用:通过动态分配
children
数组,避免了固定大小数组可能带来的内存浪费。当节点没有子节点时,children
数组不会分配内存。 - 性能:递归函数简洁明了,在处理树状结构时符合直观逻辑。由于Fortran编译器通常会对递归函数进行较好的优化,在处理一般规模的树时性能可以接受。对于大规模树,可以考虑使用栈模拟递归的方式,避免递归过深导致栈溢出问题,但这会增加代码的复杂性。