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递归与迭代的区别:递归与迭代都是循环的一种,简单比较如下:

  • 在程序结构上,递归是重复调用函数自身实现循环,迭代是通过循环结构实现。
  • 在结束方式上,递归当满足终止条件时会逐层返回再结束,迭代直接使用计数器结束循环。
  • 在执行效率上,迭代的效率明显高于递归。因为递归需要占用大量系统资源,如果递归深度很大,系统资源可能会不够用。
  • 在编程实现上,递归可以很方便的把数学公式转换为程序,易理解,易编程。迭代虽然效率高,不需要系统开销,但不容易理解,编写复杂问题时比较麻烦。

原文地址:https://www.cnblogs.com/terrymin/p/14676966.html