【问题标题】:Binary trees as innested pairs作为嵌套对的二叉树
【发布时间】:2013-04-18 09:34:36
【问题描述】:

我试图将通用二叉树表示为一对。

我将使用 SML 语法作为示例。这是我的 btree 类型定义:

datatype btree = leaf | branch of btree*btree;

所以,我想写一个函数,给定一个 btree,打印以下内容:

bprint leaf = 0
bprint (branch (leaf,leaf)) = (0,0)
bprint (branch (leaf, branch (leaf,leaf))) = (0, (0, 0))

等等。

问题是这个函数总是返回不同的类型。这显然是 SML 的问题,也可能是其他函数式语言的问题。

有什么想法吗?

【问题讨论】:

  • 我不确定您的要求是什么。为什么你的函数需要返回元组?您需要将结果用作元组吗?让它返回一个字符串会不会有问题?
  • @sepp2k 不,我没有要求。我只想将 btree 的图形表示打印到标准输出。使用元组是我唯一想到的。如果您有其他观点,请分享!
  • 好吧,如果您希望能够在其他地方使用函数的结果,除了将它们打印到屏幕上,使用字符串就可以了。如果你不这样做,你也可以让你的函数打印树。无论如何,这就是它的名字所暗示的。
  • @sepp2k 不,重复使用函数的结果不是强制性的。

标签: functional-programming binary-tree sml


【解决方案1】:

由于您要做的只是将树结构打印到屏幕上,因此您可以这样做并将函数的返回类型设为unit。这不是试图返回元组(0, (0, 0)),而是将字符串 (0, (0, 0)) 打印到屏幕上。这样你就不会在类型方面遇到任何困难。

【讨论】:

    【解决方案2】:

    如果您真的不需要其他任何地方的字符串表示,正如其他人已经提到的那样,打印树可能是最简单的方法:

    open TextIO
    
    datatype btree = leaf | branch of btree * btree
    
    fun print_btree leaf = print "0"
      | print_btree (branch (s, t)) =
        (print "("; print_btree s; print ", "; print_btree t; print ")")
    

    如果您还希望能够获得表示btree 的字符串,那么简单的解决方案是:

    fun btree_to_string leaf = "0"
      | btree_to_string (branch (s, t)) =
        "(" ^ btree_to_string s ^ ", " ^ btree_to_string t ^ ")"
    

    但是,我并不真正推荐这种变体,因为对于大 btrees,由于许多字符串连接存在问题。

    值得考虑的是以下变体,它通过一个技巧(例如也用于 Haskell 的 Show 类)避免了连接问题,即,不是处理字符串,而是处理 char 列表中的函数到字符列表。然后可以用函数组合代替串联

    fun btree_to_string' t =
      let
        fun add s t = s @ t
        fun add_btree leaf = add [#"0"]
          | add_btree (branch (s, t)) =
            add [#"("] o add_btree s o add [#",", #" "] o add_btree t o add [#")"]
      in implode (add_btree t []) end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多