相关疑难解决方法(0)

懒散的,广度优先的一元玫瑰树是否可能展开?

Data.Tree包括unfoldTreeM_BFunfoldForestM_BF使用monadic动作的结果构造树广度优先的功能.可以使用forest unfolder轻松编写树展开文件,因此我将重点关注后者:

unfoldForestM_BF :: Monad m =>
             (b -> m (a, [b])) -> [b] -> m [Tree a]
Run Code Online (Sandbox Code Playgroud)

从种子列表开始,它为每个种子应用一个函数,生成将产生树根的动作和用于下一级展开的种子.所使用的算法是稍微严格,因此,使用unfoldForestM_BF与该Identity单子是不完全一样使用纯unfoldForest.我一直试图弄清楚是否有办法让它变得懒惰而不牺牲它的O(n)时间限制.如果(正如Edward Kmett向我建议的那样)这是不可能的,我想知道是否有可能采用更具约束力的类型,特别是需要MonadFix而不是Monad.这个概念将(以某种方式)设置指向未来计算结果的指针,同时将这些计算添加到待办事项列表中,因此如果它们在早期计算的效果中是惰性的,则它们将立即可用.

algorithm tree haskell unfold monadfix

11
推荐指数
1
解决办法
879
查看次数

有没有办法在Haskell中表示静态数据?或者在Haskell中是否还有其他优雅的DFS遍历算法?

我试图使用递归算法构造DFS树.

伪代码是:

DFF(G)
Mark all nodes u as unvisited
while there is an unvisited node u do 
    DFS(u)
Run Code Online (Sandbox Code Playgroud)

.

DFS(u)
Mark u as visited
for each v in u's neighbor do 
    if v is not marked
        DFS(v)
Run Code Online (Sandbox Code Playgroud)

虽然我可以通过为un/visited节点构建某种数据结构,以简单的方式在命令式语言中轻松实现这一点,为Haskell分配动态分配或某种声明,但由于Haskell的纯粹性阻止了我,所以不可能这样做传递参数时更改数据.

data Graph a = Graph [(a,[a])] deriving (Ord, Eq, Show)
data Tree a = Node a [Tree a] deriving (Ord, Eq, Show)

type Point = (Int, Int)
type Edges = [Point]
type Path = [Point]

pathGraphFy :: Graph Point -> Point -> …
Run Code Online (Sandbox Code Playgroud)

algorithm haskell depth-first-search

6
推荐指数
1
解决办法
689
查看次数

解释Haskell广度第一个编号代码来遍历树

我正在阅读Chris Okasaki撰写的这篇论文 ; 标题为"广度优先编号:算法设计中小练习的教训".

问题是 - 算法中的魔法是怎么发生的?有一些数字(例如图7标题为"将一个级别的输出线程化为下一级别的输入")不幸的是,也许只有我,但这个数字让我感到困惑.我不明白线程是如何发生的?

algorithm tree haskell breadth-first-search tree-traversal

5
推荐指数
1
解决办法
830
查看次数

Haskell - 使用树计算最短路径

我正在尝试在haskell中编写一个代码,从A点到F点,在棋盘游戏中,本质上是一个Matrix,遵循最短的路径.

这是董事会:

AAAA
ACCB
ADEF
*
0 0 N
Run Code Online (Sandbox Code Playgroud)

机器人进入字母A,在底部(它是*),并且必须到达F,在板的底部是坐标,x = 0,y = 0,并指向北.F坐标是(3,0)

诀窍是,它不能跳过多个字母,它可以从A到B,B到C等,它可以遍历类型的字母(A到A,B到B等)

它只能前进并转弯(左,右)所以让我去F的路径就是

前进,前进,右,前进,前进,前进,右,跳,右,跳,前进,左,跳,左,前进,前进

一旦达到F,就完成了.

我想尝试这种方法,使用树

                  A
                 / \
                A   D
               / \ 
              /   \
             A     C
            / \   / \
           /   \ D   C
          A     
         / \  
        /   \ 
       A
      /
     /
    A
   / \
  B   A
 / \  
C   F 
Run Code Online (Sandbox Code Playgroud)

在那之后,我只需要验证正确的路径和最短的权利?

问题是,我没有那么多使用树木的经验.

你会指出任何其他方式来获得最佳路径吗?

非常感谢你 .

haskell graph path-finding

1
推荐指数
1
解决办法
1022
查看次数