前情提要(小引)
神奇的事情发生了,作为一个算法蒟蒻的我居然也来教各位大佬算法了!!!
十分的不自量力啊啊啊啊啊
知识储备(序)
算法的定义
首先,在学习递归算法这样一个中低阶算法时,我们首先应该了解一下它的字面意思,没错,就是“递”、“归”、“算”、“法”这四个字,它的正确读法为“递归/算法”,前面的“递归”,应该和“递推”、“递进”是互为反义词的关系,那这个“算法”又是什么呢?
——“算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间,空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。” ——百度
别看上面一大堆什么“解题方案的准确而完整的描述”、“一系列解决问题的清晰指令”、“描述解决问题的策略机制”这样的词语,以及“时间复杂度”、“空间复杂度”这样的专有名词,其实算法就是“解决问题的方法”。
例如排序算法,其实就是让你找到或使用一种方法,将一个容器排序;贪心算法,其实就是让你找到一种策略,使收益最大化……
递归算法(正文)
了解了算法的定义,那就一起来看看今天的主角——递归算法吧。
算法思想
递归算法,其实就是定义一个递归函数,进而实现递归算法,但这不就和自定义函数一样,没有区别了吗?而递归和自定义函数之间的一线之隔就是它——递归三要素:①递归函数的功能;②递归函数的终止条件(递归边界);③递归表达式。
递归函数的功能指的是这个递归函数的可以用来干什么,例如有的递归函数可以用来计算求和、阶乘等数学问题、有的递归函数可以用来枚举各种棋盘游戏的摆放或移动……这一要素是最好理解的了。
递归函数的终止条件指的是这个递归函数该在什么样的条件下停止,可是既然是一个函数,不就应该调用几次,就运行几次,运行到最后自己就停了吗?怎么还要手动停止?这就牵扯到递归函数最重要的一个要素递归表达式了!
——(重点来了!!!)递归表达式指的是这个递归函数该怎样递归下去,这句话比较难以理解,让我们举个栗子:
若果我们要定义一个计算1~n之间所有数的和的递归函数,该怎样实现呢?
假设当前递归函数的参数只有一个x,表示当前需要被加上的数字,那么1~x的和可以被表达成什么呢?没错,1~x的和,不就是1~(x - 1)的和,再加上x吗?这就和我在