Scala Learning(3): Tail Recursion定义

简介:

关于尾递归 ,使用Scala的两个例子展示尾递归的定义和简单实现。

例子比较

求最大公约数的函数

def gcd(a: Int, b: Int): Int =
  if (b == 0) a else gcd(b, a % b)

计算的展开是尾递归的,

gcd(14, 21)
-> if (21 == 0) 14 else gcd(21, 14 % 21)
-> if (false) 14 else gcd(21, 14 % 21)
-> gcd(21, 14 % 21)
-> gcd(21, 14)
-> if (14 == 0) 21 else gcd(14, 21 % 14)
-> gcd(14, 7)
-> gcd(7, 0)
-> if (0 == 0) 7 else gcd(0, 7 % 0)
-> 7

求阶乘的函数

def factorial(n: Int): Int =
  if (n == 0) 1 else n * factorial(n - 1)

计算的展开是非尾递归的,

factorial(4)
-> if (4 == 0) 1 else 4 * factorial(4 - 1)
-> 4 * factorial(3)
-> 4 * (3 * factorial(2))
-> 4 * (3 * (2 * factorial(1)))
-> 4 * (3 * (2 * (1 * factorial(0)))
-> 4 * (3 * (2 * (1 * 1)))
-> 120

尾递归定义

一个简单精炼的定义:

If a function calls itself as its last action, the function`s stack frame can be reused. This is called tail recursion.

gcd函数在else分支后面调用的是自己,而factorial函数在else分支里,调用自己之后还乘以了n,所以不是尾递归。

改写

factorial函数里,写一个函数,接收n以及累计的乘积值,即可变成尾递归。

def factorial(n: Int): Int = {
  def tailIter(product: Int, n: Int): Int = {
    if (n == 0) product
    else tailIter(product*n, n-1)
  }
  tailIter(1, n)
}

全文完 :)

目录
相关文章
|
9月前
|
Scala
Scala中的类和对象:定义、创建和使用
Scala中的类和对象:定义、创建和使用
205 1
|
Java Scala
Scala快速入门-5-类定义
每个类都有一个主构造器,这个构造器和类的定义“交织”在一起,它的参数直接成为类的字段,主构造器执行类体中所有的语句 类中的字段自动带getter和setter方法 用@BeanProperty注解生成JavaBean的getXxx/setXxx方法 辅助构造器是可选的,它们都叫做this
|
4月前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
94 5
|
4月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
70 3
|
4月前
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
77 0