任务一

编写函数listToTree: int list -> tree,将一个表转换成一棵平衡树。

提示:可调用split函数,split函数定义如下:

如果L非空,则存在L1, x, L2,满足:

split L = (L1, x, L2) 且 L = L1 @ x :: L2 且 length(L1)和length(L2)差值小于1。

datatype tree=Empty | Node of tree*int*tree;fun split [] =([],[])| split [x]=([],[x])| split (x::y::L)=let val (A,B)=split Lin (x::A,y::B)end;fun listToTree []=Empty| listToTree L=let val( l1 , x::r1 ) = split Lin Node(listToTree l1,x,listToTree r1)end;

对于递归的深刻理解(在这门课上,上课听讲,会对递归有一个更深的认识),listToTree得到的是平衡树

Node(listToTree l1 , x , listToTree r1)得到的一定也是平衡树

任务二

编写函数revT: tree -> tree,对树进行反转,使trav(revT t) = reverse(trav t)。(trav为树的中序遍历函数)。假设输入参数为一棵平衡二叉树,验证程序的正确性,并分析该函数的执行性能(work和span)。

fun revT Empty:tree=Empty:tree|  revT (Node(l1,x,r1))=Node(revT r1,x,revT l1);

同上,递归的思路,大一上的数据结构课里有类似的递归算法

work = O(n)

span = O(log n)

任务三

编写函数binarySearch: tree * int -> bool。当输入参数1为有序树时,如果树中包含值为参数2的节点,则返回true;否则返回false。要求:程序中请使用函数Int.compare(系统提供),不要使用<, =, >。

datatype order = GREATER | EQUAL | LESSfun binarySearch (Empty,x)=false|  binarySearch (Node(L,x,R),y)= case Int.compare(x,y) ofEQUAL => true|    _    => binarySearch(L,y) orelse binarySearch(R,y);

还是数据结构里树的思想

任务四

一棵minheap树定义为: 1. t is Empty; 2. t is a Node(L, x, R), where R, L are minheaps and values(L), value® >= x (value(T)函数用于获取树T的根节点的值)

编写函数

treecompare, SwapDown 和heapify:treecompare: tree * tree -> order(* when given two trees, returns a value of type order, based on which tree has a largervalue at the root node *)

fun treecompare (Empty,Empty) = EQUAL
|   treecompare (Node(l,x,r),Empty)=GREATER
|   treecompare (Empty,Node(l,x,r))=LESS
|   treecompare (Node(l1,x,r1),Node(l2,y,r2))=Int.compare(x,y);

SwapDown: tree -> tree(* REQUIRES the subtrees of t are both minheaps* ENSURES swapDown(t) = if t is Empty or all of t’s immediate children are empty then* just return t, otherwise returns a minheap which contains exactly the elements in t. *)

fun SwapDown Empty=Empty| SwapDown (Node(Empty,x,Empty))=Node(Empty,x,Empty)| SwapDown (Node(Empty,x,R)) =let val Node(l,t,r) = Rin  case Int.compare(x,t) ofGREATER => Node(Empty,t,SwapDown(Node(l,x,r)))| _ => Node(l,t,r)end| SwapDown (Node(L,x,Empty)) =let val Node(l,t,r) = Lin    case Int.compare(x,t) ofGREATER => Node(SwapDown(Node(l,x,r)),t,Empty)| _ => Node(l,t,r)end| SwapDown (Node(L,x,R))=let val Node(l1,x1,r1)=L val Node(l2,x2,r2)=Rin case treecompare(L,R) ofGREATER => if Int.compare(x,x2)=GREATER then Node(L,x2,SwapDown(Node(l2,x,r2)))else Node(L,x,R)|  _ => if Int.compare(x,x1)=GREATERthen Node(SwapDown(Node(l1,x,r1)),x1,R)else Node(L,x,R)end;

可以参考数据结构堆排序,最小堆

函数式编程实验3/华科相关推荐

  1. java实验四 集合与函数式编程实验

    (2020.4.28版) desktop/javacode/javatesthomework4 5.12版 改了StudentServiceImpl 为stream方式 5.19 优化removeif ...

  2. JAVA实验四集合与函数式编程实验

    前言:代码是分开写的,大家用的时候写在一个包里面就行 题目内容: 在com.experiment04.entity下,创建Student类,代码如下: 在com.experiment04.resour ...

  3. Standard ML泛函程序函数式编程

    Standard ML函数式编程 实验提示 实验实例1 实验实例2 实验实例3 华中科技大学函数式编程 实验提示 在'-'提示符下直接输入SML语句,以分号结束; 表达式计算的结果缺省赋值给变量&qu ...

  4. Java实验(4)集合与函数式编程

    一.实验目的 1.掌握集合的基本操作方法 2.掌握Lambda表达式的声明编写规范 3.掌握基于集合Stream的过滤/映射/聚合等操作 4.掌握基于函数式编程集合元素的移除方法 1.实验的目的是掌握 ...

  5. 函数式编程的兴衰与当前之崛起

    本文作者: Eric Elliott 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId=58e3062ba58c240ae35bb ...

  6. 用Lambda表达式进行函数式编程

    Visual Studio 2008正式发布了,我们.NET开发者也走进了新的.NET 3.5时代.相对于.NET 3.0中的Foundations,3.5的改进更注重编码体验了.新的Linq系列语法 ...

  7. 函数式编程中的两个棘手问题

    作者 | Matthew Butt­erick 译者 | 弯月 出品 | CSDN(ID:CSDNnews) 大约从十年前,我开始使用Lisp编程语言,后来我喜欢上了函数式编程.每当使用非Lisp语言 ...

  8. 【廖雪峰官方网站/Java教程】函数式编程

    本博客是函数式编程这一节的学习笔记,网址:https://www.liaoxuefeng.com/wiki/1252599548343744/1255943847278976 这一节课内容分为3个主题 ...

  9. 182_赵陈雄_java核心编程实验

    Java-核心编程实验课笔记(一) 一:Java特性和优势 1:简单性 2:面向对象 3:可移植性 4:高性能 5:分布式 6:动态性 7:多线程 8:安全性 9:健壮性 二:Java程序运行机制 1 ...

  10. JavaScript 什么是函数式编程

    原文: Master the JavaScript Interview: What is Functional Programming? 译文: 什么是函数式编程?什么是命令式?声明式 - 一起学习可 ...

最新文章

  1. [C#泛型系列文章]
  2. arm板telnetd为什么运行不了_Win10 ARM 迎来原生 PS,微软玩 ARM 能赢过苹果吗
  3. freertos 定时器 不启动_FreeRTOS 从入门到精通8--软件定时器应用
  4. python中set和dict类型_python从菜鸟到小仙的成长之路-----Dict和Set类型篇
  5. EXCEL利用VBA自由控制图表绘图区大小
  6. win7笔记本电脑如何分割和重命名磁盘
  7. 蚂蚁金服金融级容器引擎实践之路
  8. 深度学习二(Pytorch物体检测实战)
  9. command模式 java_命令模式(Command)_java实现
  10. WP7 Tip:改变启动页
  11. python猜数字游戏快速求解解决方案
  12. Linux下的文件I/O编程
  13. NodeMCU(ESP8266)按键中断实现单击-双击-长按功能
  14. MySQL数据库中主键和候选键的区别?
  15. 模拟频率f、模拟角频率Ω 、数字频率ω之间的关系
  16. iPhone软件开发前需认真考虑问题
  17. Linux设备管理(一)_kobject, kset,ktype分析
  18. BCD码与十六进制值转换
  19. USB-serial驱动分析(usb转串口)
  20. android 登录注册动画,Android开发(14)——动画实战:炫酷登录

热门文章

  1. [远程桌面连接]校园网环境下Windows系统自带的远程桌面连接软件使用
  2. 【了解Java网络编程】URL下载网络资源
  3. 涉猎java thingking in java中文版
  4. c++模板的问题解析-问题1
  5. Linux命令-cat
  6. (离线树链剖分)HDU - 6162 Ch’s gift
  7. Hexo博客技巧:添加GitHub徽标
  8. 配置学习(二)---Win10+GTX1050ti+cuda8.0+cuDNN5.1+Tensorflow-gpu1.2+Keras+Theano环境搭建
  9. 三星w系列vip服务器,三星第二款折叠屏手机W20 5G来了:7.3寸2K主屏、尊享VIP服务...
  10. 洛谷 P1579 哥德巴赫猜想(升级版)题解