JS递归
一递归:递归函数就是函数对自身的调用,是循环运算的一种算法模式。
递归必须由以下两部分组成。
- 递归调用的过程。
- 递归终止的条件:在没有限制的情况下,递归运算会无终止地自身调用。因此,在递归运算中要结合 if 语句进行控制,只有在某个条件成立时才允许执行递归,否则不允许调用自身。
二 递归主要解决的问题:主要解决一些数学运算,如阶乘函数、幂函数和斐波那契数列。
1 // 菲波那切数列 :1,1,2,3,5,8,13,21,34,55… 2 function Fib(n) { 3 if (n == 1 || n == 2) { //递归出口 4 return 1; 5 } 6 return Fib(n - 1) + Fib(n - 2); //递归体 7 } 8 // Fib(4) 3
用一棵树来理解这个函数的执行过程:
递归算法的执行过程是不断地自调用,直到到达递归出口才结束自调用过程;到达递归出口后,递归算法开始按最后调用的过程最先返回的次序返回;返回到最外层的调用语句时递归算法执行过程结束。
递归时间复杂度为O(n^2) ,用递归解决问题时,时间效率低,空间开销大,不适合很大规模的问题的求解。
三 JS递归与迭代的区别:递归与迭代都是循环的一种,简单比较如下:
- 在程序结构上,递归是重复调用函数自身实现循环,迭代是通过循环结构实现。
- 在结束方式上,递归当满足终止条件时会逐层返回再结束,迭代直接使用计数器结束循环。
- 在执行效率上,迭代的效率明显高于递归。因为递归需要占用大量系统资源,如果递归深度很大,系统资源可能会不够用。
- 在编程实现上,递归可以很方便的把数学公式转换为程序,易理解,易编程。迭代虽然效率高,不需要系统开销,但不容易理解,编写复杂问题时比较麻烦。