1、递归
1.1、找到递归函数
f(5) = 5 *f(4-1)
f(n) = n *f(n-1)
2.1、在递归函数内部,一定要有结束条件
3.1、随着递归的深入,要有机会到达结束条件
object RecursiveDemo1 {
def main(args: Array[String]): Unit = {
println(factorial(5))
}
/**
* 计算n的阶层
*
*/
def factorial(n:Long):Long = {
if(n==1) 1
else n * factorial(n-1)
}
2、尾递归
在 scala 中对尾递归做了优化,就不会出现栈溢出
在递归的时候,只有递归,没有任何其他运算,这就是尾递归
scala 做了优化(迭代算法),java 没有
要找到一个合适的累加器
走到最深层的时候,结果出来之后,也是最后的结果
object RecursiveDemo1 {
def main(args: Array[String]): Unit = {
println(factorial01(5,acc=1))
}
/**
* 计算n的阶层
*
*/
def factorial(n:Long):Long = {
if(n==1) 1
else n * factorial(n-1) // 这不是尾递归,有 n ,与递归平级的不能有其他运算
}
//累加器:用来储存中间结果 :acc
@tailrec //加上这个代码若不是尾递归会报错
def factorial01(n:Int,acc:BigInt):BigInt={
if(n==1) acc
else factorial01(n-1,n*acc) //这是尾递归,除了递归外没有其他运算
}
}
本文探讨Scala编程中的递归和尾递归概念。递归通过定义函数自身来解决问题,需包含结束条件并逐步接近解决方案。而尾递归在Scala中得到优化,避免栈溢出,其特点是递归调用为函数的最后一项操作,通常配合累加器使用,以实现迭代的效果。Java则未对尾递归进行优化。
1638

被折叠的 条评论
为什么被折叠?



