在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优化,复用函数栈相关推荐

  1. c++ 写x64汇编 5参数_第9篇-C/C++ x86_64的函数栈

    这是程序栈话题的最后一篇,可能有人会问,你前面5篇写那么多x86程序栈的文章干什么?请耐心看下去,即便现在x64硬件流行的今天,x86的过程调用约定仍然有存在的现实意义,这个戏说程序栈的最终篇,我们探 ...

  2. Scala 偏函数和偏应用函数

    偏函数 偏函数是指仅定义了输入参数的子集的函数,如下图: 这个图显示的一个偏函数:f : X -> Y,该函数仅定义了输入参数X的子集1和3,没有包含2. 在Scala中的偏函数是通过特质Par ...

  3. 栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)

    文章目录 实现 顺序栈实现 链式栈实现 应用 函数栈 的应用 表达式求值中 的应用 括号匹配中 的应用 我们使用浏览器的时候经常会用到前进.后退功能. 依次访问完一串页面 a – b – c之后点击后 ...

  4. 函数调用过程详解:函数栈帧的创建与销毁

    前言:我们在学习C语言的过程中,可以会产生很多疑问,比如: 局部变量是怎么创建的 为什么局部变量的值不做初始化就是随机值 函数是怎么传参的?传参的顺序是怎么样的? 形参和实参是什么关系? 函数调用是怎 ...

  5. 如何手工展开函数栈来定位问题

    作者:gfree.wind@gmail.com 博客:blog.focus-linux.net     linuxfocus.blog.chinaunix.net 当程序crash的时候,我们可以通过 ...

  6. 递归和函数栈与setjmp和longjmp的关系

    递归每执行一次都会释放一次函数栈 setjmp 记录函数栈的栈顶 longjmp 寻找函数栈的栈顶 如果longjmp找到了他要寻找的函数栈顶 调用setjmp的函数栈不会被释放 所以setjmp 和 ...

  7. UA SIE545 优化理论基础 函数凸性的一些有趣的判断方法

    UA SIE545 优化理论基础 函数凸性的一些有趣的判断方法 Convex function f:S→Rf:S \to \mathbb{R}f:S→R where SSS is a nonempty ...

  8. MAT之PSO:利用PSO算法优化二元函数,寻找最优个体适应度

    MAT之PSO:利用PSO算法优化二元函数,寻找最优个体适应度 目录 实现结果 设计代码 实现结果 设计代码 figure [x,y] = meshgrid(-5:0.1:5,-5:0.1:5); z ...

  9. I/O复用函数的使用——epoll

    1.epoll的接口介绍 epoll 是 Linux 特有的 I/O 复用函数.它在实现和使用上与 select.poll 有很大差异.首先,epoll 使用一组函数来完成任务,而不是单个函数.其次, ...

最新文章

  1. python序列数据类型_python 数据类型 序列——列表
  2. ajax在项目中怎么使用,我如何添加项目在sql中使用jQuery(ajax)通过web服务
  3. jTemplates 学习使用笔记
  4. 瑞幸咖啡的每一个环节,都蕴含着增长知识点
  5. Coding:在数组中查找具有给定总和的对
  6. 嵌入式操作系统内核原理和开发(内存分配算法)
  7. 用户体验改善案例_改善用户体验研究的5种习惯
  8. python中locked_Python锁类| 带示例的locked()方法
  9. 得到python对象的真实大小
  10. CentOS升级Python到2.7版本
  11. JS 逻辑中断(一)
  12. 仿淘宝中心轮播图 JS[代码+详细讲解+效果图]
  13. 【智衡跨境电商shopee运营】Shopee平台流量入口有哪些?
  14. 关于信息安全专业学习的一些看法
  15. validation参数检验 - 如何使用
  16. DeFi 2.0的LaaS协议,重振DeFi赛道发展的关键
  17. 数字图像处理:线性和非线性滤波的平滑空间滤波器(Smoothing Spatial Filters)
  18. 100年量子计算风云史,“量子比特”何时统治世界?| 技术特稿
  19. mysql:增删改查语句大全
  20. android qq存储方式,手机qq设置保存路径图解步骤

热门文章

  1. 爬虫python需要什么软件-学python爬虫能做什么
  2. Pycharm出现out of memory 的终极解决方法
  3. lua学习笔记之语句
  4. spoj A Needle in the Haystack(rabin-karp)
  5. zend studio输出中文乱码的问题
  6. 支撑微博千亿调用的轻量级RPC框架:Motan
  7. LeetCode Rotate Array(数组的旋转)
  8. LeetCode Balanced Binary Tree
  9. springBoot使用PageHelper当超过最大页数后仍然返回数据
  10. C# delegate event