【问题标题】:Trees and path finding in FortranFortran 中的树和路径查找
【发布时间】: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


【解决方案1】:

我发现当你还在使用 Python 时,将 Python 转换为另一种语言要容易得多(然后你可以在 Python 中的每一步都进行测试)。 Python 非常灵活,因此制作看起来像 F90(或几乎其他任何东西)的 Python 比反之更容易。

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

FWIW,如果您正在考虑删除递归,here 是一个很好的指南,提供了最好的方法来做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多