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

尾递归定义

1个简单精炼的定义:

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函数里,写1个函数,接收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)
}

全文完 🙂

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » Scala Learning(3): Tail Recursion定义

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡