迭代
Euclid算法
虽然是个到处都能看到的算法,但是还是想写下来,记录记录,太美
最大公约数
def gcd(a: Int, b: Int): Int =
if (b == 0) a else gcd(b, a % b)
factorial算法
def factorial(n: Int): Int =
if (n == 0) 1 else n * factorial(n - 1)
对比这两个算法,Euclid算法是尾递归,factorial算法不是尾递归,尾递归可以节约空间,不需要额外开辟空间,而不是尾递归的函数,需要额外空间来储存递归接口的信息。
@tailrec注释
scala提供了关于尾递归的注释**@tailrec**,如果标注了该注释,但是最后该函数被编译时,发现并不是尾递归,就会报错。
@tailrec
def gcd(a: Int, b: Int): Int = ...
将factorial变成尾递归
def factorial(n: Int): Int = {
def loop(acc: Int, n: Int): Int =
if (n == 0) acc
else loop(acc * n, n - 1)
loop(1, n)
}