【问题标题】:Representing A Tree in Clojure在 Clojure 中表示一棵树
【发布时间】:2010-12-19 18:01:59
【问题描述】:

在 Clojure 中表示树的惯用方式是什么?例如:

     A
    / \
   B   C
  /\    \
 D  E    F

性能并不重要,树不会超过 1000 个元素。

【问题讨论】:

  • WTF 对你们来说是错误的,每次有人不喜欢他们提出的问题。 stackoverflow 是一个学习东西的好地方,现在它已经转向 digg,有很多白痴。如果您不喜欢这个问题,那就是反对票。
  • 他们投票决定关闭它,因为它完全一样。
  • 同意;这不是关于喜欢这个问题;正如你所说的重新学习一些东西 - 也许从上次有人问同样的问题中学习?
  • 适当的做法是投反对票并添加评论指出原因。如果你有足够的社区意识去做前者,你也应该做后者。否则你只是在恶毒。
  • @MarcGravell – 副本在哪里?这是我刚才在 Google 上搜索“clojure 树”的最高结果。

标签: data-structures clojure


【解决方案1】:
'(A (B (D) (E)) (C (F)))

【讨论】:

    【解决方案2】:

    仅使用cons 有一种可怕的方法:

    (defn mktree 
      ([label l r] (cons label (cons l r))) 
      ([leaf] (cons leaf (cons nil nil))))
    (defn getlabel [t] (first t))
    (defn getchildren [t] (rest t))
    (defn getleft [t] (first (getchildren t)))
    (defn getright [t] (rest (getchildren t)))
    

    请注意,children 不是列表;这是一对。如果你的树不只是二元的,你可以把它做成一个列表。当然,当没有左右孩子时使用 nil。

    否则,请参阅this answer

    图片中的树:

    (mktree 'A (mktree 'B (mktree 'D) (mktree 'E)) (mktree 'C nil (mktree 'F)))
    

    【讨论】:

    • 它有 first & rest 代替 car cdr
    • 谢谢 ;) common lisp 两者都有。我会编辑。它确实有“缺点”吗?
    • 我认为你应该编辑它说“我只知道普通的 lisp”。 Common Lisp 不是“Lisp”。这是一个 Lisp。
    【解决方案3】:

    树几乎是 Clojure 中所有内容的基础,因为它们非常适合持久数据结构中的结构共享。 Maps 和 Vectors 实际上是具有高分支因子的树,以赋予它们有限的查找和插入时间。所以我能给出的最短答案(虽然它并不是那么有用)是我真的推荐Purely functional data structures by Chris Okasaki 来真正回答这个问题。还有 Rich Hickey 在 blip.tv 上关于 Clojure 数据结构的视频

    (set 'A 'B 'C)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多