题目:
有一只乌龟,他要跳上一定阶数的台阶,每次只能跳1或2格,问有几种跳法。
分析:
可以将问题拆分为,乌龟每次跳跃都有跳1格或2格的可能。那么跳过某一台阶,只要解决乌龟跳过1格后有几种可能加上乌龟跳过2格后有几种可能即可,这种解法就是递归。终止条件为乌龟距离终点还剩0格或1格,此时就是一种路线。
解答:
我上方的终止条件为距离终点只剩1格或2格。只剩1格那么就只能跳一格。剩2格那么就有跳一格与跳2格两种可能(也可以直接写距离终点剩1或0格时返回1)。从写法上来看,我们可以发现使用递归解决这个问题十分轻松,并且短短几行就可以解决这个问题,换其他方法可能感觉无从下手。
递归的缺点:
递归的思想为大事化小,类似多米诺骨牌。虽然可以帮助我们较为轻松的解决一部分复杂的问题,但是容易导致栈溢出的问题,同时运算过程也非常的慢。所以可以适当地使用递归,但不能过于依赖。
递归容易导致堆栈,造成大量内存浪费,所以我们最好使用尾递归。
尾递归:
尾递归实在递归函数的最后才调用自身。可以这么理解,一个递归函数,他在运算的过程中突然要调用自身,那么就需要拿出部分空间来实现新一轮递归。而尾递归则是将递归函数置于最后,在最后一步返回的时候执行递归。这可以节省不少空间。
尾递归使用场景:
直接看案例。
对于尾递归函数,他的返回值就是wdg(n-1,a*n),那么上一级尾递归函数就可以直接没掉了。
但对于递归函数,他的返回值为n*dg(n-1),他的返回值需要先算出dg(n-1)然后才可以乘上n返回一个值,因此下一级递归函数运算时仍要保留上一级,这就相当于空间浪费了。
总结:
递归是将大事化小,并且逐渐趋向退出条件的函数。我们使用递归往往可以很轻松的解决一个麻烦的问题。但同时也要注意递归使用时可能造成的浪费现象,多使用尾递归代替递归,这也相当于一种优化。