递归就是函数运行时调用自己,这个函数就叫递归函数,调用的过程叫做递归。递归(有递有归)先不断调用自身(递),直到遇到终止条件后进行回溯(归),最终返回答案。
一、什么时候能用递归?
- 一个大问题的解可以分解成几个子问题的解
- 子问题的求解思路和大问题完全一样
- 存在 「递归终止」 条件
二、怎么写递归代码?
-
明确函数的功能
-
找出 「递归终止条件」 我们必须找出递归的结束条件,不然会一直调用自己,陷入死循环。也就是说,我们需要找出当参数为啥时,递归结束,之后直接返回结果。
-
找出函数的 「等价关系式」 通过一些辅助变量或操作来 「不断缩小参数的范围」 ,并保持原函数结果不变,从而实现原函数的等价关系式。
注意,js和所有语言一样,内存中有一块专门存放函数调用的空间,称为 “函数调用栈” ,当我们调用函数或声明局部变量时,都是用它来保存。每调用一个函数,都会将临时变量封装为栈帧压入内存栈,等函数执行完成返回时才出栈。如果递归求解的数据规模很大,调用层次很深,一直压入栈,就会有堆栈溢出的风险。