前言
第一次接触递归是大一C语言课程, 过了这么久,当时讲了啥已经忘记得差不多了, 但递归倒是从当时的一无所知到了现在的略知一二, 因此想把我自己对递归的理解拿出来跟大家分享一下, 希望这是一篇有帮助的文章。其中有个我认为很有用的技巧, 如有大佬觉得有问题, 还请直接指出
什么是递归算法
定义
部分人将递归定义成: 直接或间接调用自身的算法。但实际上这句话只凸显了“递归”二字中的“递”字, 而没有体现出“归”字。那么什么是递归? 递归实际上就像是“俄罗斯套娃”:
- 把一个大型问题转化成与原问题同类型的小问题(如同套娃,大的套小的, 两者的结构功能是一样的, 但是问题大小不同), 然后拆解成更小的问题
- 当子问题无法进行再拆时, 就可以解决最小的问题, 然后再回归到次小的问题中解决次小的问题, 一直回归到最开始要求的问题,解决即可(如同套娃拆开之后的又装回去,最小的装完装次小的, 直到最外层套娃装好就解决问题)
三要素
递归的三要素是指, 当用递归解决问题时, 一般都从这三个方面去分析考虑以及定义
- 函数功能:递归函数首先它是一个函数, 不论什么函数都有自己明确的功能,即明确的知道这个函数是干嘛用的, 比如:比较函数的功能就是比较两个数的大小
- 终止条件:递归不可能无限递归下去(就像套娃总得有最小的一个),无论是从执行时的内存考虑还是想要求原问题结果考虑, 都需要找到一个终止条件用以结束递归,逐次返回最上层.不妨以求阶乘为例来讲解, 我们要求n的阶乘, 就要求n - 1的阶乘(result = n * f(n - 1), f(n - 1)表示求n - 1的阶乘), 要求n - 1的阶乘就要求n - 2的阶乘...以此类推。到最后, 求2的阶乘和求1的阶乘时, 可以直接计算出结果, 所以不需要再往下递归(即小于等于2)
def func(n):
if n <= 2: # 终止条件