scala实战学习-尾递归函数

Posted fengzzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scala实战学习-尾递归函数相关的知识,希望对你有一定的参考价值。


$$
Sigmasideset{^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},acc=${acc}")
                loop(n + 1, acc + f(n))
            }
        }
        loop(a, 0)      //n从a开始,acc从0开始
    }
    sum(x => x)(1)(5)   //将f(X)、a、b传到sum函数中
                                                  //> n=1,acc=0
                                                  //| n=2,acc=1
                                                  //| n=3,acc=3
                                                  //| n=4,acc=6
                                                  //| n=5,acc=10
                                                  //| n=6,acc=15
                                                  //| res0: Int = 15
    sum(x => x * x)(1)(5)                         //> n=1,acc=0
                                                  //| n=2,acc=1
                                                  //| n=3,acc=5
                                                  //| n=4,acc=14
                                                  //| n=5,acc=30
                                                  //| n=6,acc=55
                                                  //| res1: Int = 55
    val sumSquare=sum(x => x*x)_                   //> sumSquare  : Int => (Int => Int) = <function1>
    sumSquare(1)(5)                                //> n=1,acc=0
                                                  //| n=2,acc=1
                                                  //| n=3,acc=5
                                                  //| n=4,acc=14
                                                  //| n=5,acc=30
                                                  //| n=6,acc=55
                                                  //| res3: Int = 55



以上是关于scala实战学习-尾递归函数的主要内容,如果未能解决你的问题,请参考以下文章

scala-尾递归

Scala尾递归优化

[Notes] 简单的 Scala 尾递归函数

如何在 Scala 中使用 Stream.cons 编写不泄漏的尾递归函数?

在 trait 中定义的 Scala 尾递归流处理器函数持有对流头的引用

Haskell 尾递归内部函数