什么是递归?
一个过程或函数在执行的过程中,间接或直接的调用自身的一种方法
目的?
就是把一个大型的复杂的问题,层层转化成为一个与原问题类型但是规模较小的问题进行解决,利用较少的代码量来解决问题所需要重复的多次的运算
递归和循环对比
1:代码要简洁很多
2:逻辑的实现要简单很多
递归实现的过程
递归的执行,是从外往里执行,弹出的时候是从里往外弹出,一层一层执行执行递归时,递归函数会一直执行到自己符合退出条件时。才会从里往外弹出执行栈
递归的缺点:
1:性能,会导致栈溢出,由于递归执行的方式导致的,每次都会往执行栈内推执行函数,需要一直增加到符合自己退出条件时,才开始弹出栈,如果递归量过大,超过栈的容量,就会导致栈溢出
2:效率,由于性能不好,继而导致了递归函数的执行效率也不会很高,每次递归函数的执行,内存都需要给函数分配空间和地址,来存数据,入栈和出栈都是需要时间,自然导致效率不会高,另外一个就是可能会导致重复计算,如果所需要解决的问题存在重叠部分,则会重复计算,例如斐波那契数列
解决递归问题的方案
1:尾递归 = 尾调用 + 递归
定义:是一个参数将每次循环前的值累计起来,传入当前函数内,从而降低了空间的复杂度从O(n)降到O(1)
目的:解决函数栈溢出的问题,每次调用都是一个栈,永远不会栈溢出
2:尾调用
函数的最后一个操作是返回一个调用函数的结果。
即最后一步新调用的函数结果作为当前函数的结果返回
降低空间的复杂度
实现一个函数在调用另外一个函数的时候,本身可以被释放
需要使用严格模式 'use strict'
解决递归重复计算的问题
memoization技术用与优化代码,避免一些不必要的重复计算
实现的原理:利用空间换时间的方式,提升效率