Tree 二叉树约简函数

Tree 二叉树约简函数,tree,binary-tree,sml,reduce,Tree,Binary Tree,Sml,Reduce,所以我有一个SML的任务,我需要一些帮助开始 问题是这样的 编写一个类型为'a btree->int的函数btree\u size,返回 二叉树的大小。(二叉树的大小是 二叉树中的元素)。例如,btree_大小(节点(叶,1, 节点(叶,2,叶))应返回2。您的函数必须使用 提供btree_reduce功能,最多3行 btree_reduce函数如下所示 (* A reduction function. *) (* btree_reduce : ('b * 'a * 'b ->

所以我有一个SML的任务,我需要一些帮助开始

问题是这样的

编写一个类型为'a btree->int的函数btree\u size,返回 二叉树的大小。(二叉树的大小是 二叉树中的元素)。例如,btree_大小(节点(叶,1, 节点(叶,2,叶))应返回2。您的函数必须使用 提供btree_reduce功能,最多3行

btree_reduce函数如下所示

(* A reduction function. *)
     (* btree_reduce : ('b * 'a * 'b -> 'b) -> 'b -> 'a tree -> 'b) *)
    fun btree_reduce f b bt =
      case bt of
      Leaf => b
      | Node (l, x, r) => f (btree_reduce f b l, x, btree_reduce f b r)

我到底该怎么做一个btree_size函数来获取一个btree并使用reduce函数来给出树的大小?

既然这是一个家庭作业,我就不直接回答了。:)

我将按如下方式进行:

  • 熟悉计算树的大小(通过编写符合您的规范的递归函数)
  • 查看您编写的函数和btree_reduce之间的共同点(或者,可以从您编写的函数中抽象出什么)

当然,这是众多方法中的一种。

因为这是一个家庭作业,所以我不会直接给出答案

我将按如下方式进行:

  • 熟悉计算树的大小(通过编写符合您的规范的递归函数)
  • 查看您编写的函数和btree_reduce之间的共同点(或者,可以从您编写的函数中抽象出什么)

当然,这是众多方法之一。

是的,递归地说,函数很简单。fun btree_size bt=叶的情况bt=>0 |节点(btl,x,brt)=>btree_size btl+1+btree_size btr我不知道如何告诉reduce函数每次添加1。我知道我们将要做这样的事情减少(“告诉它添加”,0,bt)我只是不知道如何告诉它每次添加一个我想你已经明白了。传递给btree_reduce的函数f包含3个参数。第一个参数和第三个参数是两个递归调用的结果,对吗?在btree_size的归纳情况下,结果的形式为x+1+y,其中x=btree_size btl,y=btree_size btr。你需要更多的提示吗?是的,我明白。我不知道如何创建一个传递到reduce的函数,它告诉它这样做。我试过的所有东西都没有编译好。我是否需要创建一个外部助手函数,或者是否有一些内置的SML功能可以做到这一点?只是尝试了这个。有趣的加法器abc=1+a+c;fun btree_size bt=btree_reduce(myAdder,0,bt);它爆炸了所以你被语法绊倒了,对吗?你试过fn(x,a,y)=>。。。?顺便说一句,这里有一个有用的关键字“local”,可以用作“inside-out-let”。是的,递归地说,这个函数很简单。fun btree_size bt=叶的情况bt=>0 |节点(btl,x,brt)=>btree_size btl+1+btree_size btr我不知道如何告诉reduce函数每次添加1。我知道我们将要做这样的事情减少(“告诉它添加”,0,bt)我只是不知道如何告诉它每次添加一个我想你已经明白了。传递给btree_reduce的函数f包含3个参数。第一个参数和第三个参数是两个递归调用的结果,对吗?在btree_size的归纳情况下,结果的形式为x+1+y,其中x=btree_size btl,y=btree_size btr。你需要更多的提示吗?是的,我明白。我不知道如何创建一个传递到reduce的函数,它告诉它这样做。我试过的所有东西都没有编译好。我是否需要创建一个外部助手函数,或者是否有一些内置的SML功能可以做到这一点?只是尝试了这个。有趣的加法器abc=1+a+c;fun btree_size bt=btree_reduce(myAdder,0,bt);它爆炸了所以你被语法绊倒了,对吗?你试过fn(x,a,y)=>。。。?顺便说一句,这里有一个有用的关键字“local”,可以用作“inside-out-let”。