你不知道的:递归

递归是一种编程方法,形式上看是函数自己调用自己,直到问题解决,如下所示。
你不知道的:递归
递归问题,也可以用循环的方式解决,如下所示
你不知道的:递归
使用循环,程序的性能可能更高;使用递归,程序可能更容易理解。递归的主要目的是让实现算法的形式更加优雅,性能上的提升不多。请参考欧几里得算法,体验什么是优雅。

欧几里得算法:gcd(a,b) = gcd(b,a mod b)

每个递归函数都有两个部分:

  • 基线条件(base case):函数不在调用自己,避免形成无限循环
  • 递归条件(recursive case):函数调用自己,每次递归调用,都必须使问题的规模缩小

使用递归函数,相当于把当前为解决的问题压栈;每次调用自己的时候,在调用位置把当前变量压栈,直到遇到基线条件,不再压栈,然后不断返回处理的结果,最终把问题解决。
假设一个问题,可以用压栈的模型来解决,那么,可以用递归的形式实现算法。递归让代码更加简洁,却会引入压栈的开销,因为每次调用自己,计算机都会在栈空间申请一块内存,保存当前的变量。
递归的本质就是用压栈与出栈操作,在递推过程中压栈,遇到基线条件后,在会归过程不断出栈,最终完成问题的解决。你不知道的:递归