递归
定义
- 直接或间接就调用自身算法的过程
使用
- 子问题为同类事物,且更简单
- 必须有出口(例阶乘计算)
优缺点
-
代码简洁
-
逻辑清晰,易实现
-
效率低
-
层次太深,耗内存且易栈溢出(非用不可,最好使用缓存避免相同计算,限制递归调用次数)
例:求1~100000的和,可使用尾递归优化
/**
* 尾递归优化:求1~100000的和
* 调用自身后无其他操作:n阶乘计算,斐波那契数列,都有其他操作
* 关键字:tailrec
* 原理:转化为迭代求和(循环累加)
*/
tailrec fun sum(n: Int, sum: Int = 0): Int =
when {
n < 1 -> -1
n == 1 -> sum + 1
else -> sum(n - 1, sum + n)
}
示例
- 求n阶乘
/**
* 递归
*/
fun main() {
println("${recursion(3)}")
}
/**
* n阶乘计算
*/
fun recursion(n: Int): Int {
if (n < 1) return -1
if (n == 1) return 1
return n * recursion(n - 1)
}
- 斐波那契数列
/**
* 斐波那契数列:当前数 = 前面一个数 + 前面第二个数
*
* 1 1 2 3 5 8 13 21 34 55 89 ...
*/
fun fibonacci(n: Int): Int {
if (n < 1) return -1
if (n < 3) return 1
return fibonacci(n - 1) + fibonacci(n - 2)
}