ML语言支持嵌套的函数声明。也就是说将函数作为参数,并把函数当作值返回。

直接上代码

fun main()
{letfun fib0(n) =letfun fib1(n) =letfun fib2(n) = fib1(n-1) + fib2(n-2)inif(n >= 4) then fib2(n)else fib0(n-1) + fib0(n-2)endinif n >= 2 then fib1(n)else 1endinfib0(4)end;
}

如果这段代码没看懂,希望下面这段话能够帮到你。
对于ML语言,函数是可以嵌套定义的,(这就和我们之前学过的c和java都不一样),所以可以咋一看不好理解。函数都是由函数名函数体组成,ML语言的函数体由“ let——in——end ”共同组成。
下面这张图片可以帮你更好的理解上面的代码:

当你看懂上面这张图片,我们就可以分析这个main函数的执行过程。
当我们看一个函数时,首先要看函数体的三个部分的in部分(注意不是先看let部分) ,in中的代码一般是仅声明要调用哪个函数,然后再去let中去调用这个函数。

完整分析过程如下:
1.先进入main函数,然后看红色的in部分:fib0( 4 );
2.然后去main()的let块去找fib0函数(图中绿色部分),进入fib0函数,同样这个函数的in部分(绿色的in):满足if条件,执行fib1( 4 );
3.去fib0函数的let部分找fib1函数(蓝色部分),进入fib1函数,先看in部分(蓝色的in),满足if语句,执行fib2函数,然后去fib1函数的let部分。此时执行fib1(3) + fib1(2);

先算fib1(3),,我们再去找fib1函数,然后是fib1的in部分,满足else语句。执行fib0(2)+fib0(1);

先求fib0(2),找到fib0函数,满足if语句,执行fib1(2);
找fib1函数,进入蓝色in部分,满足else,执行fib0(1)+fib0(0);

先求fib0(1),找到fib0函数,进入绿色in部分,满足else,结束这个fib0(1)函数;
再求fib0(0),找到fib0函数,同样满足else,结束这个fib0(0)函数;

再求上面剩下的fib0(1),找到fib0函数,满足else,结束这个fib0(1)函数;

注意,上面还剩下一个函数没有处理,fib1(2),进入fib1,满足else,接着执行fib0(1)+fib(0),因为上面的步骤已经执行过这句代码,不再赘述。

至此,本文结束。

编译原理 ML语言的初次接触(龙书)相关推荐

  1. 【编译原理】语言认知之Java、Python、C++快速排序三者运行效率与开发效率比较

    [编译原理]语言认知之Java.Python.C++快速排序&三者运行效率与开发效率比较 一.实验目的 二.实验环境 三.实验步骤 四.快速排序程序 五.实验结果 六.总结 一.实验目的 强化 ...

  2. 编译原理SNL语言编译器实验报告

    完成实验内容 实验要求: (1)设计并实现SNL程序设计语言的编译程序 (2)四个必做: 词法分析模块 语法分析模块(递归下降方法) 语法分析模块(LL(1)方法) 语义分析模块 (3)编程语言不限 ...

  3. 大前端开发者需要了解的基础编译原理和语言知识

    转自:https://yq.aliyun.com/articles/180879 在我刚刚进入大学,从零开始学习 C 语言的时候,我就不断的从学长的口中听到一个又一个语言,比如 C++.Java.Py ...

  4. micropython编译原理_C语言嵌入式Linux高级编程第9期:CPU和操作系统入门视频课程...

    嵌入式开发是一门交叉学科. 它要求我们的嵌入式工程师,不仅学习C语言.汇编.软件工程等软件层面的知识技能,还要求对CPU内部工作机制.计算机系统架构.操作系统原理.编译器等都有一个全局的认识和把握. ...

  5. 太原理工 编译原理 c语言,太原理工大学编译原理实验

    <太原理工大学编译原理实验>由会员分享,可在线阅读,更多相关<太原理工大学编译原理实验(19页珍藏版)>请在人人文库网上搜索. 1.本科实验报告课程名称: 编译原理 实验项目: ...

  6. 【编译原理】语言的定义

    文章目录 推导和规约 句子和句型 短语,直接短语和句柄 素短语 推导和规约 下面是关于推导的定义: 当n=1时,即符号串a0经过1步推导出an,记为直接推导. 如下,推导的过程就是用产生式的右部替换左 ...

  7. 编译原理 SysY语言的词法分析程序

    实验目的与内容 对SysY语言进行词法分析,可以查出语言中可能包含的词法错误. 从控制台输入字符串,如有出错则输出错误,没有错误则按照二元组的方式输出 设计方法 对SysY语法进行分析如下: (1) ...

  8. 编译原理 C语言词法分析程序的设计与实现

    词法分析程序 目录 一. 实验题目 二. 实验要求 三. 程序设计说明 四. 源程序 五. 可执行程序 六. 测试报告: 1. 输入 2. 输出 3. 分析说明 一.实验题目 C语言词法分析程序的设计 ...

  9. 编译原理三大经典书籍(龙书 虎书 鲸书)

    1.龙书(Dragon book) 英文名:Compilers: Principles,Techniques,and Tools 作者:Alfred V.Aho,Ravi Sethi,Jeffrey ...

最新文章

  1. 初中计算机指导教师意见,初中信息技术教学计划(推荐3篇)
  2. 扫描 VNC 的脚本
  3. 如何使用pip升级所有Python软件包?
  4. 用计算机制作演示文稿教案博客,制作演示文稿 教学反思
  5. Elasticsearch 教程--入门
  6. Python之pandas:pandas中常见的数据类型转换四大方法以及遇到的一些坑之详细攻略
  7. eclipse鼠标变十了_Eclipse在过去十年中的主要成就
  8. 信息设计中的“父子关系”
  9. 为爱追寻_从机械师到编码员:追寻梦想如何改变了我的生活
  10. Java打造一款SSH客户端,已开源!
  11. Linux:ubuntu 下安装软件,卸载,查看已经安装的软件
  12. Lingo教育版免费申请流程
  13. win10系统进不了服务器失败,快速解决Win10安装失败重启进不了系统的方法
  14. 远程ntp服务器响应模式6查询,H3C WP5048无线PoE注入器 命令参考-Release 2208-6W100
  15. UVA1723 Intervals
  16. 软件开发与软件研发的区别
  17. 系统工程--011详细设计 伪码 程序流程图 PAD图 N-S图 判断表和判断树
  18. 28js学习第十一天定时器函数
  19. apm性能监控系统,现在做Android开发有前途吗?系列篇
  20. 2017-2018-1 20162316刘诚昊 实验三 查找与排序

热门文章

  1. python找出10000以内的质数_查找10000以内的质数
  2. 数字图像处理的研究方法
  3. allegro 对齐元器件_Allegro怎么对元器件进行对齐?
  4. 【autojs】Auto.js Pro截图取色脚本源代码
  5. CakePHP FAQ(常见问题)整理
  6. 学习日志 - Openwrt安装python然后wallproxy
  7. 专利评估的方法与流程!
  8. 【PS必备】各系色卡对照表
  9. 配置拦截器 UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either
  10. 为什么要选择NIUSHOP开源网店系统