【问题标题】:Haskell: Count Nodes of a TreeHaskell:计算树的节点
【发布时间】:2018-06-29 17:34:32
【问题描述】:

我有一个自定义数据类型:

data Tree a = Node a [Tree a]

示例树:

tree1 = Node 3 [Node 4 [Node 3 [], Node 2 []], Node 5 []]

我正在努力创建一个函数来计算树的节点数。

我有一个函数:

numNodes :: Num p => Tree a -> p
numNodes(Node a []) = 0
numNodes(Node a b) = 1 + numNodes b

但这并没有真正奏效,我哪里错了?

编辑: 编译器输出:

   • Couldn't match type ‘Tree a’ with ‘[Tree a]’
      Expected type: [Tree a] -> p
        Actual type: Tree a -> p

   • Relevant bindings include
        numNodes :: [Tree a] -> p (bound at tree.hs:28:1)


28 | numNodes(Node a []) = 0

【问题讨论】:

  • numNodes 应该获取节点列表还是单个节点?编译器错误信息是什么意思?
  • 嗨,numNodes 应该采用像“tree1”这样的树
  • @Bergi 我在问题中添加了 de 编译器输出
  • b 不是一棵树。
  • 您的实际代码包含类型签名,不是吗?一定要把它也包括在这里。

标签: haskell count functional-programming tree nodes


【解决方案1】:

首先,您不能用您的数据类型表示一棵空树;你只能用一个没有子树的节点来表示一棵树。

numNodes (Node a []) = 1

其次,每个节点都作为0个或多个substrees作为孩子。您需要使用map 计算每个子树中的节点数,然后将每个子树的计数相加。

numNodes (Node a b) = 1 + sum (map numNodes b)

因为sum [] == 0 根据定义,您实际上并不需要基本情况​​,因为无论b 是否为非空,sum (map numNodes b) 都会返回正确的计数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多