数据结构与算法(递归算法)

100 阅读1分钟

递归

定义

  • 直接或间接就调用自身算法的过程

使用

  • 子问题为同类事物,且更简单
  • 必须有出口(例阶乘计算)

优缺点

  • 代码简洁

  • 逻辑清晰,易实现

  • 效率低

  • 层次太深,耗内存且易栈溢出(非用不可,最好使用缓存避免相同计算,限制递归调用次数)

例:求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)
}