Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion Fortran中的树与路径发现_Recursion_Tree_Fortran_Nodes_Fortran95 - Fatal编程技术网

Recursion 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

我试图在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等的所有上游路径进行调用)我一直在研究如何使用指针,但似乎找不到任何此类路径查找的示例。

我发现,在您仍然使用Python的情况下,将Python转换为另一种语言要容易得多(然后您可以在每一步都使用Python进行测试)。Python非常灵活,因此要使Python看起来像F90(或几乎任何其他东西),要比使Python看起来像F90容易得多

我以前用汇编语言来做这件事。我会修改我的python,使它看起来更像汇编程序,然后尝试在汇编程序中编写代码,意识到我遗漏了一些东西,然后再次修改python。当我完成的时候,我已经有了易于阅读的Python和汇编语言,并且有了一对一的对应关系,并且Python已经在每一步都经过了测试。当我运行汇编语言时,它刚刚工作(TM)


如果您正在考虑删除递归,那么FWIW是一个很好的指南,可以帮助您找到最好的方法。

您有fortran95标签,您是否仅限于此,或者您是否也会使用较新的功能?如果有帮助,我可能会使用较新的功能。好吧,这取决于您希望如何实现,我认为,这完全可以用指针来完成。或者你可以算出一些数组结构。如果您想使用对象,可以使用F2003中添加的面向对象功能。数据结构的选择主要取决于您的偏好。寻找性能?结果是否需要经常访问,或者更频繁地修改。像这样的东西。以你的方式,你的问题太宽泛了,不可能有一个好的答案。答案是:是的。。。