Scala尾递归】的更多相关文章

递归函数应用 首先,我们来对比两个递归方法的求值步骤. 假设有方法gcd,用来计算两个数的最大公约数.下面是欧几里得算法的实现: def gcp(a: Int, b: Int): Int = if (b == 0) a else gcp(b, a % b) gcp(14, 21)的求解过程如下: gcp(14, 21) if (21 == 0) 14 else gcd(21, 14 % 21) if (false) 14 else gcd(21, 14 % 21) gcd(21, 14 % 21…
以递归方式思考 递归通过灵巧的函数定义,告诉计算机做什么.在函数式编程中,随处可见递归思想的运用.下面给出几个递归函数的例子: object RecursiveExample extends App{ // 数列求和例子 def sum(xs: List[Int]): Int = if (xs.isEmpty) 1 else xs.head + sum(xs.tail) // 求最大值例子 def max(xs: List[Int]): Int = if (xs.isEmpty) throw n…
Scala对尾递归进行了优化,甚至提供了专门的标注告诉编译器需要进行尾递归优化.不过这种优化仅限于严格的尾递归,间接递归等情况,不会被优化. 尾递归的概念 递归,大家都不陌生,一个函数直接或间接的调用它自己,就是递归了.我们来看一个简单的,计算阶乘的例子. def factorial(n: Int): Int = { if( n <= 1 ) 1 else n * factorial(n-1) } 以上factorial方法,在n>1时,需要调用它自身,这是一个典型的递归调用.如果n=5,那么…
Scala进阶之路-尾递归优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 递归调用有时候能被转换成循环,这样能节约栈空间.在函数式编程中,这是很重要的,我们通常会使用递归方法来遍历集合.而不是所有的递归都能被优化.递归之所有能被优化是在指在函数的最后一行为递归调用(即尾递归),并且这个递归调用没有其它元素参与. 一.什么情况能导致栈的溢出 1>.循环调用 答:循环调用并不会导致栈的溢出,因为循环是一个压栈和弹栈的过程. 2>.递归调用 答:递归调用会导致栈的溢出.因为递…
Scala 经典的模式匹配和尾递归 package io import java.io.{BufferedWriter, File, FileWriter} import java.text.SimpleDateFormat import scala.annotation.tailrec import scala.io.Source /** * author: HuaZhe Ray * * describe: 计算服务调用平均时长 * * createDate: 2017/12/15 * cre…
code1: object factorial{ def main(args:Array[String])={ println(factorial(args(0).toInt)) } def factorial(x:Int):Int = if (x==0) 1 else x * factorial(x-1) } 这个实现的执行过程如下,比如我们计算4的阶乘factorial(4) factorial(4) --> if (4==0) 1 else 4 * factorial(4-1) -->4…
一.背景 获取数据中以“|”作为字段间的分隔符,但个别字段中数据也是以“|”作为分隔符.因此,在字段提取时需要保护数据完整性. 二.实现 1.数据以“|”分隔,可以采用递归方式迭代解析.通过尾递归方式降低运行风险: 2.尾递归中使用模式匹配: 3.解析时,根据separator做遍历,“‘”和“’”(一对引号之间的数据作为一个整体cell),引号前数据位head(即使为空,也可以),cell后的数据由下一次迭代解析,则整个结构为:result+head+cell(引号间的数据)+(head+ce…
求 $$ \Sigma\sideset{^b_a}f(x) $$ object sumfunc{ def sum(f: Int => Int)(a: Int)(b:Int): Int = { @annotation.tailrec def loop(n: Int,acc: Int): Int = { if(n > b){ println(s"n=${n},acc=${acc}") acc //当计算到b值,返回acc值 }else{ println(s"n=${n…
我的确认为计算机学院应该开一门 Scala 的语言课程. 在这篇文章中,我会讲述为什么我会有这样的想法,在此之前,有几点我想要先声明一下: 本文无意对编程语言进行评比,我要讲述的主体是为什么你应该学习 Scala.51CTO之前曾发布过一篇 Java 程序员为何要学习Scala的文章,可能也会对你有所帮助. 目前 Scala 有两个实现方式,一种是在 JVM(Java 虚拟机)上运行,另一种是在 CLR(Common Language Runtime 的缩写,即公共语言运行库)上运行.不过,JV…
目录[-] 1.   Scala有多cool 1.1.     速度! 1.2.     易用的数据结构 1.3.     OOP+FP 1.4.     动态+静态 1.5.     DSL 1.6.     够复杂 1.7.     够有趣 1.8.     开发社区 2.   lang 2.1.     和Java的异同 2.1.1.  语法 2.1.2.  库 2.2.     变量 2.2.1.  保留字 2.2.2.  变量标识 2.2.3.  变量定义 2.2.3.1     va…