【问题标题】:Haskell - Rose Trees PathsHaskell - 玫瑰树路径
【发布时间】:2022-01-21 16:48:18
【问题描述】:

我在 Haskell 中做一个小项目,我在创建“玫瑰树”的函数路径时遇到了困难。我的玫瑰树有一个不同的点,从一开始我就有四种可能性。

我想做的是:

data RoseTree a = Start [RoseTree Movimento] | Node a [RoseTree Movimento]
        deriving (Eq, Show)

paths :: RoseTree Movimento -> [[Movimento]]
paths (Start []) = []
paths (Node n []) = [[n]]
paths (Node n ns) = map ((:) n . concat . paths) ns
paths (Start xs) = undefined

PS -> 树示例:

data Movimento = AndarEsquerda | AndarDireita | Trepar | InterageCaixa 
  deriving (Show, Read, Eq, Ord)

Start [Node AndarEsquerda [Node AndarDireita [Node AndarEsquerda [],Node Trepar []]],Node Trepar [Node AndarDireita [Node AndarDireita []],Node AndarEsquerda [Node AndarEsquerda []]]]

预期输出:

[[AndarEsquerda, AndarDireita, AndarEsquerda],
 [AndarEsquerda, AndarDireita, Trepar],
 [Trepar, AndarDireita, AndarDireita],
 [Trepar, AndarEsquerda, AndarEsquerda]] 

Tree Example

【问题讨论】:

  • 你是如何定义玫瑰树的?
  • 对不起,我真的忘记了:data RoseTree a = Start [RoseTree Movimento] |节点 a [RoseTree Movimento] 推导 (Eq, Show)
  • 你给了我们一些输入数据的例子,为什么不也举一个你期望paths example给出的例子。
  • 输入:Start [Node AndarEsquerda [Node AndarDireita [Node AndarEsquerda [],Node Trepar []]],Node Trepar [Node AndarDireita [Node AndarDireita []],Node AndarEsquerda [Node AndarEsquerda []] ]] 输出:[[AndarEsquerda, AndarDireita, Andar Esquerda], [AndarEsquerda, AndarDireita, Trepar], [Trepar, AndarDireita, AndarDireita], [Trepar, AndarEsquerda, AndarEsquerda]]
  • 阿方索,您编辑问题。我是paths input 应该得到的结果。顺便说一句,要解决缺少的分支,您需要问自己 Start 与 Node 有何不同。

标签: haskell path tree binary project


【解决方案1】:

在您的代码中是表达式paths (Start xs) 的未定义右侧。 如果我使用表达式 (paths n) ++ (paths (Start ns)) 定义,它不会返回所需的输出。

琐碎案例 [] 可以,但您不要使用(n:ns) recursion 遍历列表 以使琐碎案例发生。您使用 map 函数进行迭代,这是递归的替代方法。

我使用map 函数滚动到树的宽度和递归浏览到树的深度。

paths2 :: RoseTree Movimento -> [[Movimento]]
paths2 (Start []) = []
paths2 (Node m []) = [[m]]
paths2 (Node m (n:ns)) = map ((++) [m]) ((paths2 n) ++ (paths2 (Start ns)))
paths2 (Start (n:ns)) = (paths2 n) ++ (paths2 (Start ns)) 

输出:

[[AndarEsquerda,AndarDireita,AndarEsquerda],
[AndarEsquerda,AndarDireita,Trepar],
[Trepar,AndarDireita,AndarDireita],
[Trepar,AndarEsquerda,AndarEsquerda]]

编辑:您可能喜欢使用Start 中的(n:ns)

paths2 :: RoseTree Movimento -> [[Movimento]]
paths2 (Start []) = []
paths2 (Node m []) = [[m]]
paths2 (Node m ns) = map ((:) m) $ paths2 (Start ns)
paths2 (Start (n:ns)) = paths2 n ++ paths2 (Start ns)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2015-10-21
    • 1970-01-01
    相关资源
    最近更新 更多