Scala Learning(3): Tail Recursion定义
来源:互联网 发布:松江云安消防主机编程 编辑:程序博客网 时间:2024/06/06 02:19
关于尾递归 ,使用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)}
全文完 :)
0 0
- Scala Learning(3): Tail Recursion定义
- tail recursion
- Scala-2 - 7 - Lecture 1.7 - Tail Recursion (12_32)
- Tail recursion and normal recursion
- 尾递归 - Tail Recursion
- 尾递归 tail recursion
- Tail Recursion 尾递归
- 尾递归(Tail recursion / Tail call)
- 尾递归(tail recursion) 的简单使用
- 递归与尾递归(Tail Recursion)
- Scala Learning
- Tail call optimization in Scala
- 阶乘的尾递归(Tail Recursion)写法(C++)
- Erlang tail recursion和body recursion 在OTP19.1版本上执行时间差异
- codingbat:recursion-1:3
- Recursion
- Recursion
- Recursion
- Oracle ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
- 写在四月末的序
- 运算符
- Oracle字符集、编码
- SQLiteConstraintException在androidMediaProvider数据库中的分析
- Scala Learning(3): Tail Recursion定义
- lua学习笔记之浅淡table
- hdu1290 献给杭电五十周年校庆的礼物
- (7-7)hive复合数据类型
- Genymotion 模拟器启动不了
- IOS系统自带社交分享
- VBA第2课 复制,选择与删除
- 防止easyui的panel/window/dialog组件超出浏览器边境
- android 关于各种 adapter