scala tail recursive优化,复用函数栈
在scala中如果一个函数在最后一步调用自己(必须完全调用自己,不能加其他额外运算子),那么在scala中会复用函数栈,这样递归调用就转化成了线性的调用,效率大大的提高。If a function calls itself as its last action, the function's stack frame can be reused. This is called tail recursion.=> Tail recursive functions are iterative process 这里实现了两个版本的阶乘函数,一个是普通的写法,另外一个使用了tail recursive的优化
/* In Scala, only directly recursive call to the current function are optimized. One can require that a function is tail-recursive using a @tailrec annotation:@tailrecdef gcd(a: Int, b: Int): Int = ... If the annotation is given, and the implementation of gcd were not tail recursive, an error would be issued. */import scala.annotation.tailrecobject exercise {def factorial(n: Int): Int =if (n == 0) 1 else n * factorial(n-1)//a tail recursive version of factorialdef factorialTailRecursion(n: Int): Int = {@tailrecdef loop(acc: Int, n: Int): Int =if (n == 0) accelse loop(acc * n, n-1)loop(1, n)}factorial(4)factorialTailRecursion(4) //optimized! the function's stack frame can be reused! }
scala tail recursive优化,复用函数栈相关推荐
- c++ 写x64汇编 5参数_第9篇-C/C++ x86_64的函数栈
这是程序栈话题的最后一篇,可能有人会问,你前面5篇写那么多x86程序栈的文章干什么?请耐心看下去,即便现在x64硬件流行的今天,x86的过程调用约定仍然有存在的现实意义,这个戏说程序栈的最终篇,我们探 ...
- Scala 偏函数和偏应用函数
偏函数 偏函数是指仅定义了输入参数的子集的函数,如下图: 这个图显示的一个偏函数:f : X -> Y,该函数仅定义了输入参数X的子集1和3,没有包含2. 在Scala中的偏函数是通过特质Par ...
- 栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)
文章目录 实现 顺序栈实现 链式栈实现 应用 函数栈 的应用 表达式求值中 的应用 括号匹配中 的应用 我们使用浏览器的时候经常会用到前进.后退功能. 依次访问完一串页面 a – b – c之后点击后 ...
- 函数调用过程详解:函数栈帧的创建与销毁
前言:我们在学习C语言的过程中,可以会产生很多疑问,比如: 局部变量是怎么创建的 为什么局部变量的值不做初始化就是随机值 函数是怎么传参的?传参的顺序是怎么样的? 形参和实参是什么关系? 函数调用是怎 ...
- 如何手工展开函数栈来定位问题
作者:gfree.wind@gmail.com 博客:blog.focus-linux.net linuxfocus.blog.chinaunix.net 当程序crash的时候,我们可以通过 ...
- 递归和函数栈与setjmp和longjmp的关系
递归每执行一次都会释放一次函数栈 setjmp 记录函数栈的栈顶 longjmp 寻找函数栈的栈顶 如果longjmp找到了他要寻找的函数栈顶 调用setjmp的函数栈不会被释放 所以setjmp 和 ...
- UA SIE545 优化理论基础 函数凸性的一些有趣的判断方法
UA SIE545 优化理论基础 函数凸性的一些有趣的判断方法 Convex function f:S→Rf:S \to \mathbb{R}f:S→R where SSS is a nonempty ...
- MAT之PSO:利用PSO算法优化二元函数,寻找最优个体适应度
MAT之PSO:利用PSO算法优化二元函数,寻找最优个体适应度 目录 实现结果 设计代码 实现结果 设计代码 figure [x,y] = meshgrid(-5:0.1:5,-5:0.1:5); z ...
- I/O复用函数的使用——epoll
1.epoll的接口介绍 epoll 是 Linux 特有的 I/O 复用函数.它在实现和使用上与 select.poll 有很大差异.首先,epoll 使用一组函数来完成任务,而不是单个函数.其次, ...
最新文章
- python序列数据类型_python 数据类型 序列——列表
- ajax在项目中怎么使用,我如何添加项目在sql中使用jQuery(ajax)通过web服务
- jTemplates 学习使用笔记
- 瑞幸咖啡的每一个环节,都蕴含着增长知识点
- Coding:在数组中查找具有给定总和的对
- 嵌入式操作系统内核原理和开发(内存分配算法)
- 用户体验改善案例_改善用户体验研究的5种习惯
- python中locked_Python锁类| 带示例的locked()方法
- 得到python对象的真实大小
- CentOS升级Python到2.7版本
- JS 逻辑中断(一)
- 仿淘宝中心轮播图 JS[代码+详细讲解+效果图]
- 【智衡跨境电商shopee运营】Shopee平台流量入口有哪些?
- 关于信息安全专业学习的一些看法
- validation参数检验 - 如何使用
- DeFi 2.0的LaaS协议,重振DeFi赛道发展的关键
- 数字图像处理:线性和非线性滤波的平滑空间滤波器(Smoothing Spatial Filters)
- 100年量子计算风云史,“量子比特”何时统治世界?| 技术特稿
- mysql:增删改查语句大全
- android qq存储方式,手机qq设置保存路径图解步骤