 MoonBit月兔编程语言 现代编程思想 第十四课 案例:堆栈虚拟机	
条件判断 7. } 8 类型定义 函数 1. struct Function { 2. name : String 3. // 只考虑⼀种数据类型,故省略每个数据的类型,只保留名称和数量 4. params : List[String]; result : Int; locals : List[String] 5. instructions : List[Instruction] Call("add") ] 在栈上存储函数的返回值数量 …… Const(1) 1 …… Const(2) 1 2 …… Call("add") 1 …… 2 Function(1) a b 12 函数计算 例: add(1, 2) 1. Lists::[ Const(1), Const(2), Call("add") ] 在栈上存储函数的返回值数量 …… 3 Function(1) ] 当执⾏ If(n, then_block, else_block) 时栈顶为⾮0整数( true ) 执⾏then_block 否则,执⾏else_block n 表示代码块返回的参数数量 …… Const(1) 1 …… Const(0) 0 …… …… 0 Equal IF …… Const(0) 0 End Result: I32 Param: _ ……0 码力 | 31 页 | 594.38 KB | 1 年前3 MoonBit月兔编程语言 现代编程思想 第十四课 案例:堆栈虚拟机	
条件判断 7. } 8 类型定义 函数 1. struct Function { 2. name : String 3. // 只考虑⼀种数据类型,故省略每个数据的类型,只保留名称和数量 4. params : List[String]; result : Int; locals : List[String] 5. instructions : List[Instruction] Call("add") ] 在栈上存储函数的返回值数量 …… Const(1) 1 …… Const(2) 1 2 …… Call("add") 1 …… 2 Function(1) a b 12 函数计算 例: add(1, 2) 1. Lists::[ Const(1), Const(2), Call("add") ] 在栈上存储函数的返回值数量 …… 3 Function(1) ] 当执⾏ If(n, then_block, else_block) 时栈顶为⾮0整数( true ) 执⾏then_block 否则,执⾏else_block n 表示代码块返回的参数数量 …… Const(1) 1 …… Const(0) 0 …… …… 0 Equal IF …… Const(0) 0 End Result: I32 Param: _ ……0 码力 | 31 页 | 594.38 KB | 1 年前3
 MoonBit月兔编程语言 现代编程思想 第十课 哈希表与闭包	
Array[Bucket[Entry[K, V]]] // 存放键值对的列表,存放列表的数组 12. mut length : Int // 数组⻓度,动态维护 13. mut size : Int // 哈希表键值对数量,动态维护 14. } 6 哈希表:直接寻址 添加/更新操作 添加时,根据键的哈希计算出应当存放的位置 遍历集合查找键 如果找到,修改值 否则,添加键值对 删除操作类同 0 3 1 to_double() >= load { // 根据负载重新分配 19. resize() 20. } 21. } 8 哈希表:直接寻址 虽然不存在数组⽤尽的问题,但仍需要扩容重新分配 负载:键值对数量与数组⻓度的⽐值 当负载上升,哈希/索引冲突变多,链表增⻓,增查改删操作时间增⻓ 解决⽅案:当负载超过阈值,重新分配更⼤的数组 阈值过⾼:寻址遍历时间变⻓ 阈值过低:扩容分配时间变⻓ 9 occupied : Array[Bool] // 存放当前位置是否为空的数组 9. mut length : Int // 数组⻓度,动态维护 10. mut size : Int // 哈希表键值对数量,动态维护 11. } 12 哈希表:开放寻址 添加/更新操作 添加/更新时,根据键的哈希计算出应当存放的位置 如果该位置被占⽤ 如果是对应的键,则更新对应的值 否则,向后查找 如果找到空位,则存放键值对0 码力 | 27 页 | 448.83 KB | 1 年前3 MoonBit月兔编程语言 现代编程思想 第十课 哈希表与闭包	
Array[Bucket[Entry[K, V]]] // 存放键值对的列表,存放列表的数组 12. mut length : Int // 数组⻓度,动态维护 13. mut size : Int // 哈希表键值对数量,动态维护 14. } 6 哈希表:直接寻址 添加/更新操作 添加时,根据键的哈希计算出应当存放的位置 遍历集合查找键 如果找到,修改值 否则,添加键值对 删除操作类同 0 3 1 to_double() >= load { // 根据负载重新分配 19. resize() 20. } 21. } 8 哈希表:直接寻址 虽然不存在数组⽤尽的问题,但仍需要扩容重新分配 负载:键值对数量与数组⻓度的⽐值 当负载上升,哈希/索引冲突变多,链表增⻓,增查改删操作时间增⻓ 解决⽅案:当负载超过阈值,重新分配更⼤的数组 阈值过⾼:寻址遍历时间变⻓ 阈值过低:扩容分配时间变⻓ 9 occupied : Array[Bool] // 存放当前位置是否为空的数组 9. mut length : Int // 数组⻓度,动态维护 10. mut size : Int // 哈希表键值对数量,动态维护 11. } 12 哈希表:开放寻址 添加/更新操作 添加/更新时,根据键的哈希计算出应当存放的位置 如果该位置被占⽤ 如果是对应的键,则更新对应的值 否则,向后查找 如果找到空位,则存放键值对0 码力 | 27 页 | 448.83 KB | 1 年前3
 MoonBit月兔编程语言 现代编程思想 第三课 函数, 列表与递归	函数的应⽤与计算 当函数定义后,可以通过 <函数名>(<表达式>, <表达式>……) 的⽅式应⽤函数 one() add_char('m', "oonbit") 应⽤函数时,表达式与函数定义时的参数数量应当相同,且类型⼀⼀对应 这是错误的: add_char("oonbit", 'm') 计算应⽤函数的表达式时 从左到右计算定义了参数的表达式的值 替换函数内部参数 简化表达式 6 函数的应⽤与计算 (Int, Int, Int) 接受⼀个元组并返回⼀个元组 11 数据类型:列表 12 列表:⼀个数据的序列 我们有时会收到⼀些数据,具备以下特征: 数据是有序的 数据是可以重复的 数据的数量是不定的 举例来说 ⼀句话中的⽂字:� '⼀' '句' '话' '中' '的' '⽂' '字' � DNA序列:� G A T T A C A � …… 13 列表的接⼝ 我们定义⼀个单向不可变列表0 码力 | 42 页 | 587.59 KB | 1 年前3 MoonBit月兔编程语言 现代编程思想 第三课 函数, 列表与递归	函数的应⽤与计算 当函数定义后,可以通过 <函数名>(<表达式>, <表达式>……) 的⽅式应⽤函数 one() add_char('m', "oonbit") 应⽤函数时,表达式与函数定义时的参数数量应当相同,且类型⼀⼀对应 这是错误的: add_char("oonbit", 'm') 计算应⽤函数的表达式时 从左到右计算定义了参数的表达式的值 替换函数内部参数 简化表达式 6 函数的应⽤与计算 (Int, Int, Int) 接受⼀个元组并返回⼀个元组 11 数据类型:列表 12 列表:⼀个数据的序列 我们有时会收到⼀些数据,具备以下特征: 数据是有序的 数据是可以重复的 数据的数量是不定的 举例来说 ⼀句话中的⽂字:� '⼀' '句' '话' '中' '的' '⽂' '字' � DNA序列:� G A T T A C A � …… 13 列表的接⼝ 我们定义⼀个单向不可变列表0 码力 | 42 页 | 587.59 KB | 1 年前3
 MoonBit月兔编程语言 现代编程思想 第一课 课程介绍与程序设计	
如果喝掉了⽔瓶中的⽔,那么⽔瓶就会变成空的。 给你两个整数 num_bottles 和 num_exchange ,返回你最多可以喝到多少瓶⽔。 ⸺⼒扣1518 8 步骤1:理解问题 涉及到哪些概念 当前拥有⽔瓶数量与喝过的⽔瓶总数 它们之间的关系怎样? 初始拥有⽔瓶数为 num_bottles 当拥有的⽔瓶数超过 num_exchange 时,我们可以喝掉 num_exchange 瓶⽔并换 得⼀瓶⽔,并且继续操作0 码力 | 15 页 | 2.01 MB | 1 年前3 MoonBit月兔编程语言 现代编程思想 第一课 课程介绍与程序设计	
如果喝掉了⽔瓶中的⽔,那么⽔瓶就会变成空的。 给你两个整数 num_bottles 和 num_exchange ,返回你最多可以喝到多少瓶⽔。 ⸺⼒扣1518 8 步骤1:理解问题 涉及到哪些概念 当前拥有⽔瓶数量与喝过的⽔瓶总数 它们之间的关系怎样? 初始拥有⽔瓶数为 num_bottles 当拥有的⽔瓶数超过 num_exchange 时,我们可以喝掉 num_exchange 瓶⽔并换 得⼀瓶⽔,并且继续操作0 码力 | 15 页 | 2.01 MB | 1 年前3
 MoonBit月兔编程语言 现代编程思想 第八课 队列:可变数据实现	
% self.array.length() // 超出队尾则转回队⾸ 12. self.length = self.length + 1 13. self 14. } 问题:如果元素数量超出了数组⻓度 7 循环队列 队列的扩容操作 我们⾸先判断是否需要扩容 我们创建新的更⻓的数组,并将原有数据进⾏复制 1. fn push(self: Queue, t: Int) ->0 码力 | 19 页 | 314.79 KB | 1 年前3 MoonBit月兔编程语言 现代编程思想 第八课 队列:可变数据实现	
% self.array.length() // 超出队尾则转回队⾸ 12. self.length = self.length + 1 13. self 14. } 问题:如果元素数量超出了数组⻓度 7 循环队列 队列的扩容操作 我们⾸先判断是否需要扩容 我们创建新的更⻓的数组,并将原有数据进⾏复制 1. fn push(self: Queue, t: Int) ->0 码力 | 19 页 | 314.79 KB | 1 年前3
 MoonBit月兔编程语言 现代编程思想 第四课 多元组, 结构体,枚举类型	Cons(0, _) => true 5. Cons(_, tl) => contains_zero(tl) 6. } 7. } 11 多元组和结构体的模式匹配 多元组模式匹配需数量⼀⼀对应 1. fn first(pair: (Int, Int)) -> Int { 2. match pair { 3. (first, second) => first 4.0 码力 | 26 页 | 435.86 KB | 1 年前3 MoonBit月兔编程语言 现代编程思想 第四课 多元组, 结构体,枚举类型	Cons(0, _) => true 5. Cons(_, tl) => contains_zero(tl) 6. } 7. } 11 多元组和结构体的模式匹配 多元组模式匹配需数量⼀⼀对应 1. fn first(pair: (Int, Int)) -> Int { 2. match pair { 3. (first, second) => first 4.0 码力 | 26 页 | 435.86 KB | 1 年前3
 MoonBit月兔编程语言 现代编程思想 第五课 数据类型:树、二叉树、二叉搜索树、AVL树	
v),其中u是v的⽗节点或者v是u的⽗节点 4 树的逻辑结构 这不是⼀颗树 5 树的逻辑结构 计算机中的树根节点在上,⼦节点在⽗节点下⽅ 相关术语 节点的深度:根节点下到这个节点的路径的⻓度(边的数量) 根节点深度为0 节点的⾼度:节点下到叶节点的最⻓路径的⻓度 叶节点⾼度为0 树的⾼度:根节点的⾼度 只有⼀个节点的树⾼度为0 空树(没有节点的树)⾼度为-1 也有的定义将树的⾼度等同于最⼤层次,以根为第⼀层0 码力 | 29 页 | 1015.26 KB | 1 年前3 MoonBit月兔编程语言 现代编程思想 第五课 数据类型:树、二叉树、二叉搜索树、AVL树	
v),其中u是v的⽗节点或者v是u的⽗节点 4 树的逻辑结构 这不是⼀颗树 5 树的逻辑结构 计算机中的树根节点在上,⼦节点在⽗节点下⽅ 相关术语 节点的深度:根节点下到这个节点的路径的⻓度(边的数量) 根节点深度为0 节点的⾼度:节点下到叶节点的最⻓路径的⻓度 叶节点⾼度为0 树的⾼度:根节点的⾼度 只有⼀个节点的树⾼度为0 空树(没有节点的树)⾼度为-1 也有的定义将树的⾼度等同于最⼤层次,以根为第⼀层0 码力 | 29 页 | 1015.26 KB | 1 年前3
共 7 条
- 1













