我试图在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到5的所有上游路径,我一直在研究如何使用指针,但似乎找不到任何有关此类路径查找的例子。
答案 0 :(得分:3)
我发现当你还在Python中时,将Python转换为另一种语言要容易得多(然后你可以在每一步都用Python测试)。 Python是如此灵活,以至于使Python看起来像F90(或几乎其他任何东西)要容易得多。
我曾经用汇编语言这样做。我修改我的python使它看起来更像汇编程序,然后尝试用汇编程序编写它,意识到我错过了什么,然后再次修改Python。当我完成时,我使用了Python和汇编语言,这些语言易于阅读并且具有一对一的对应关系,并且 Python已经过测试的每一步。当我运行汇编语言时,汇编语言正常工作。
FWIW,如果你正在考虑移除递归,here是一个很好的指导,可以做到最好的方法。