【发布时间】:2015-09-23 19:25:51
【问题描述】:
我正在尝试在 Fortran 90 中复制一些 Python 代码,以使其在我参与的更大的 Fortran 项目中工作。具体来说,我正在尝试转换一些递归识别二叉树中上游路径的代码,例如在以下示例中:
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、等)我一直在研究使用指针,但似乎找不到任何这种寻路的例子。
【问题讨论】:
-
您有 fortran95 标签,您是否仅限于此,或者您还会使用更新的功能?
-
如果有帮助,我可能会使用更新的功能。
-
嗯,这取决于您希望如何实现它,我认为它可以仅使用指针来完成。或者你可以计算出一些数组结构。如果要使用对象,可以使用 F2003 中添加的面向对象功能。数据结构的选择主要取决于你的喜好。寻找性能?是否需要经常访问结果,或者更频繁地修改结果。像这样的东西。以您的方式,您的问题太宽泛,无法给出一个好的答案。是否有可能的答案是:是的......
标签: recursion tree fortran nodes fortran95