Recursion Fortran中的树与路径发现
我试图在Fortran 90中复制一些Python代码,使其在我正在参与的更大的Fortran项目中工作。具体地说,我正在尝试转换一些递归地标识二叉树中上游路径的代码,如以下示例中所示:Recursion Fortran中的树与路径发现,recursion,tree,fortran,nodes,fortran95,Recursion,Tree,Fortran,Nodes,Fortran95,我试图在Fortran 90中复制一些Python代码,使其在我正在参与的更大的Fortran项目中工作。具体地说,我正在尝试转换一些递归地标识二叉树中上游路径的代码,如以下示例中所示: 4 -- 5 -- 8 / 2 --- 6 - 9 -- 10 / \ 1 -- 11 \ 3 ----7 此树由以下内容表示和遍历: class Node(object): def __init__(self
4 -- 5 -- 8
/
2 --- 6 - 9 -- 10
/ \
1 -- 11
\
3 ----7
此树由以下内容表示和遍历:
class Node(object):
def __init__(self):
self.name = None
self.parent = None
self.children = set()
self._upstream = set()
def __repr__(self):
return "Node({})".format(self.name)
# Recursively search upstream in the drainage network, returns a set of all paths
@property
def upstream_paths(self):
if not self._paths:
for child in self.children:
if child.upstream_paths:
self._paths.extend([child] + path for path in child.upstream_paths)
else:
self._paths.append([child])
return self._paths
from collections import defaultdict
edges = {(11, 9), (10, 9), (9, 6), (6, 2), (8, 5), (5, 4), (4, 2), (2, 1), (3, 1), (7, 3)}
nodes = collections.defaultdict(lambda: Node())
for node, parent in edges:
nodes[node].name = node
nodes[parent].name = parent
nodes[node].parent = nodes[parent]
nodes[parent].children.add(nodes[node])
在Fortran 90中可以实现类似的功能吗?我对f90中的递归有很好的理解,但是如果没有Python的面向对象性,我无法想象这是如何做到的
编辑:
有关进一步说明:
我打算做的是确定树状河流网络中的上游排水路径。对于任何给定的出口(根),可能有数百或数千条上游路径。一旦网络初始化,就不需要对其进行修改,尽管会有对网络中许多不同节点的调用(在上面的示例中,将对来自1、来自6、来自5等的所有上游路径进行调用)我一直在研究如何使用指针,但似乎找不到任何此类路径查找的示例。我发现,在您仍然使用Python的情况下,将Python转换为另一种语言要容易得多(然后您可以在每一步都使用Python进行测试)。Python非常灵活,因此要使Python看起来像F90(或几乎任何其他东西),要比使Python看起来像F90容易得多 我以前用汇编语言来做这件事。我会修改我的python,使它看起来更像汇编程序,然后尝试在汇编程序中编写代码,意识到我遗漏了一些东西,然后再次修改python。当我完成的时候,我已经有了易于阅读的Python和汇编语言,并且有了一对一的对应关系,并且Python已经在每一步都经过了测试。当我运行汇编语言时,它刚刚工作(TM)
如果您正在考虑删除递归,那么FWIW是一个很好的指南,可以帮助您找到最好的方法。您有fortran95标签,您是否仅限于此,或者您是否也会使用较新的功能?如果有帮助,我可能会使用较新的功能。好吧,这取决于您希望如何实现,我认为,这完全可以用指针来完成。或者你可以算出一些数组结构。如果您想使用对象,可以使用F2003中添加的面向对象功能。数据结构的选择主要取决于您的偏好。寻找性能?结果是否需要经常访问,或者更频繁地修改。像这样的东西。以你的方式,你的问题太宽泛了,不可能有一个好的答案。答案是:是的。。。