scala之尾递归

object Main extends App {

  def Fibonacci1(n: Int): Int = {
    if (n == 1 || n == 0) 1
    else
      Fibonacci1(n - 1) + Fibonacci1(n - 2)
  }

  def Fibonacci2(n: Int): Int = {
    if (n == 1 || n == 0) 1
    else {
      var lop = 2
      var sum = 0
      while (lop > 0) {
        sum = sum + Fibonacci2(n - lop)
        lop = lop - 1
      }
      sum

    }

  }

  val t1 = System.nanoTime();
  println(Fibonacci1(10))
  val t2 = System.nanoTime();
  println(Fibonacci2(10))
  val t3 = System.nanoTime();
  println(t2 - t1)
  println(t3 - t2)
}

输出为:

89
89
43777662
29317
object Main extends App {

 def sumInts1(a:Int,b:Int,sum:Int):Int={
   if(a>b) sum
   else sumInts1(a+1,b,sum+a)
 }
 def sumInts2(a:Int,b:Int):Int={
   if(a>b) 0
   else
     a+sumInts2(a+1,b)
 }
  val t1 = System.nanoTime();
  println(sumInts1(10,100,0))
  val t2 = System.nanoTime();
  println(sumInts2(10,100))
  val t3 = System.nanoTime();
  println(t2 - t1)
  println(t3 - t2)
}

输出为:

5005
5005
45856323
44255

待整理

时间: 2024-10-11 21:20:01

scala之尾递归的相关文章

【Scala】尾递归优化

以递归方式思考 递归通过灵巧的函数定义,告诉计算机做什么.在函数式编程中,随处可见递归思想的运用.下面给出几个递归函数的例子: 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 Tail Recursion (尾递归)

Scala对尾递归进行了优化,甚至提供了专门的标注告诉编译器需要进行尾递归优化.不过这种优化仅限于严格的尾递归,间接递归等情况,不会被优化. 尾递归的概念 递归,大家都不陌生,一个函数直接或间接的调用它自己,就是递归了.我们来看一个简单的,计算阶乘的例子. def factorial(n: Int): Int = { if( n <= 1 ) 1 else n * factorial(n-1) } 以上factorial方法,在n>1时,需要调用它自身,这是一个典型的递归调用.如果n=5,那么

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

以斐波那契数列的计算函数为例, 实践 Scala 中尾递归函数的编写 object Test extends App { def fib(n: Int): Int = { @annotation.tailrec def fib_iter(f0: Int, f1: Int, cnt: Int): Int = if (cnt <= 0) f0 else fib_iter(f1, f0+f1, cnt-1) fib_iter(0, 1, n) } (0 until 10).foreach { n =>

Scala学习笔记(二)

笔记的整理主要针对Scala对比Java的新特性:   1.if表达式 if表达式是有结果返回的. val a= if (5>2) "你好" else 1 a的值为if表达式返回值为 "你好"   2.while表达式 while表达式是没有返回值的(返回值为 Unit),在scala中避免使用,通常都需要与var结合使用   3.for表达式 枚举集合遍历 val a = Array(1,2,3,4,5,6) for (i <- a) println(

Scala总结

===概述 scala是一门以java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言. scala是纯粹的面向对象的语言.java虽然是面向对象的语言,但是它不是纯粹的,因为java的基本数据类型不是类,并且在java中还有静态成员变量和静态方法.相反,scala是纯粹面向对象的,每个值都是对象,每个操作都是方法调用. scala也是一个成熟的函数式语言.函数式编程有两个指导思想:①函数是头等值,也就是说函数也是值,并且和其他类型(如整数.字符串等)

JVM原生不支持尾递归优化,但是Scala编译器支持

The JVM doesn't support TCO natively, so tail recursive methods will need to rely on the Scala compiler performing the optimization.----------"Scala in Depth" 3.5.2 Jvm本身是不支持尾递归优化得,需要编译器支持,而Java编译器不支持,但是Scala支持.写一个简单的计算1到n的和的递归算法验证一下. public cla

Thinking in scala (4)----阶乘与尾递归

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

scala实战学习-尾递归函数

求 $$ \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编程实例 在刚开始学习一门编程语言的时候,总是想去写一些比较大的程序和项目,但是由于基础不扎实,往往欲速则不达.所以,只能一步一步来,通过一些经典的小例子来实践和锻炼,最终不断加深编程的技能,坚持下来,相信慢慢就能够变得熟练. 冒泡排序.选择排序.插入排序的一般写法 这三种排序方法没有太多要说的东西,这里的编程方式和指定式方式没什么差别. 这里之所以使用Array数据,因为Array数组是可变的对象序列,其元素值可以改变,而List类对象的元素是不可变的. 这里的写法不是函数式风格