program sum_array
implicit none
integer, parameter :: n = 5
integer :: arr(n) = [1, 2, 3, 4, 5]
integer :: total
total = sum_recursive(arr, n)
print *, '数组所有元素的和为:', total
contains
integer function sum_recursive(arr, size)
integer, intent(in) :: arr(:)
integer, intent(in) :: size
if (size == 1) then
sum_recursive = arr(1)
else
sum_recursive = arr(size) + sum_recursive(arr, size - 1)
end if
end function sum_recursive
end program sum_array
解释
- 主程序部分:定义了一个长度为
n
的整数数组arr
,并初始化数组元素。调用递归函数sum_recursive
计算数组的和,并输出结果。
- 递归函数
sum_recursive
:
- 参数:接受一个整数数组
arr
和数组的当前长度size
。
- 递归终止条件:当数组长度为1时,直接返回数组唯一的元素,这是递归的终止条件,避免无限递归。
- 递归调用:对于长度大于1的数组,函数将当前数组的最后一个元素与剩余数组(长度减1)的和相加,从而递归地计算整个数组的和。
优化递归深度问题
- 尾递归优化:在上述代码中,虽然Fortran编译器不一定能自动进行尾递归优化,但编写尾递归形式的代码有助于在支持尾递归优化的编译器上提升性能。尾递归是指递归调用是函数的最后一个操作,在本代码中
sum_recursive = arr(size) + sum_recursive(arr, size - 1)
这一步接近尾递归形式,理论上可以通过编译器优化避免栈溢出问题。
- 手动模拟栈:如果递归深度可能非常大,可以手动使用栈数据结构来模拟递归过程,从而避免栈溢出。不过在Fortran中实现手动栈较为复杂,一般先考虑编译器的优化能力和尾递归优化。