gpt4 book ai didi

recursion - Fortran 递归段错误

转载 作者:行者123 更新时间:2023-12-01 12:00:08 30 4
gpt4 key购买 nike

我必须设计并实现一个 Fortran 例程来确定方形点阵上簇的大小,并且以递归方式对子例程进行编码似乎非常方便。然而,每当我的格子大小增长超过某个值(大约 200/边)时,子程序始终会出现段错误。这是我的集群检测例程:

RECURSIVE SUBROUTINE growCluster(lattice, adj, idx, area)
INTEGER, INTENT(INOUT) :: lattice(:), area
INTEGER, INTENT(IN) :: adj(:,:), idx

lattice(idx) = -1
area = area + 1

IF (lattice(adj(1,idx)).GT.0) &
CALL growCluster(lattice,adj,adj(1,idx),area)

IF (lattice(adj(2,idx)).GT.0) &
CALL growCluster(lattice,adj,adj(2,idx),area)

IF (lattice(adj(3,idx)).GT.0) &
CALL growCluster(lattice,adj,adj(3,idx),area)

IF (lattice(adj(4,idx)).GT.0) &
CALL growCluster(lattice,adj,adj(4,idx),area)
END SUBROUTINE growCluster

其中 adj(1,n) 代表站点 n 的北邻,adj(2,n) 代表西,依此类推。什么会导致不稳定的段错误行为?对于大晶格尺寸,集群是否“太大”了?

最佳答案

我认为您遇到了堆栈溢出。如果你的格子每边超过 200 个单位,那就是 40,000 个单位,这意味着你要递归 40,000 次。根据您的堆栈大小和堆栈帧大小,您可能很容易耗尽堆栈空间。

您必须将算法转换为使用较少堆栈空间的算法才能处理较大的格子。 Wikipedia提供了一些关于如何在不炸毁堆栈的情况下进行洪水填充的实现(以伪代码形式)。

关于recursion - Fortran 递归段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2640190/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com