JS编程建议——30:使用递归模式

简介: 30:使用递归模式

建议30:使用递归模式
复杂算法通常比较容易使用递归实现。很多传统算法正是通过递归实现的,如阶乘函数。

  1. function factorial(n) {
  2. if(n == 0) {
  3. return 1;
  4. } else {
  5. return n * factorial(n – 1);
  6. }
  7. }
    递归函数的问题:错误定义或缺少终结条件会导致函数长时间运行,使浏览器出现假死现象。此外,递归函数还会受到浏览器调用栈大小的限制。

JavaScript引擎所支持的递归数量与JavaScript调用栈大小直接相关。只有IE例外,因为它的调用栈与可用系统内存相关,而其他浏览器有固定的调用栈限制。当使用了太多的递归,超过最大调用栈尺寸时,浏览器会弹出错误信息。
调用栈溢出错误可以用try catch语句捕获。异常类型因浏览器而不同:在Firefox中,它是一个InternalError错误;在Safari和Chrome 中,它是一个RangeError错误;在IE中会抛出一个一般性的Error类型;在Opera中不抛出错误,但会终止JavaScript引擎。正确处理这些错误的方法如下:

  1. try {
  2. recurse();
  3. } catch (ex){
  4. alert("errorInfo");
  5. }
    当出现调用栈尺寸限制的问题时,第一步应该定位在代码中的递归实例上。为此,有两个递归模式可供选择。

第一种是直接递归模式,即一个函数调用自身。当发生错误时,这种模式比较容易定位。其一般模式如下:

  1. function recurse(){
  2. recurse();
  3. }
  4. recurse();
    第二种是精巧模式,它包含两个函数:
  5. function first(){
  6. second();
  7. }
  8. function second(){
  9. first();
  10. }
  11. first();
    在这种递归模式中,两个函数互相调用对方,形成一个无限循环。大多数调用栈错误与这两种模式有关。常见的栈溢出原因是一个不正确的终止条件,因此定位模式错误的第一步是验证终止条件。如果终止条件是正确的,那么算法包含了太多层递归,为了能够安全地在浏览器中运行,应改用迭代、制表或混合模式。
相关文章
|
1月前
|
前端开发 JavaScript 开发者
探索JavaScript ES6的八种常见使用技巧:开启现代编程之旅
探索JavaScript ES6的八种常见使用技巧:开启现代编程之旅
|
1月前
|
JavaScript 前端开发 开发者
编程笔记 html5&css&js 071 JavaScript Symbol 数据类型
编程笔记 html5&css&js 071 JavaScript Symbol 数据类型
|
10天前
|
JavaScript
node.js递归拼凑成树形结构
node.js递归拼凑成树形结构
10 0
|
1月前
|
存储 JavaScript 编译器
这款国产中文编程火了!通过文言文编译生成Python、JS、Ruby代码!
这款国产中文编程火了!通过文言文编译生成Python、JS、Ruby代码!
|
1月前
|
JavaScript 前端开发
JavaScript递归的理解(最详细)
JavaScript递归的理解(最详细)
|
1月前
|
JavaScript 前端开发
编程笔记 html5&css&js 079 JavaScript 循环语句
编程笔记 html5&css&js 079 JavaScript 循环语句
|
1月前
|
JavaScript 前端开发 开发者
编程笔记 html5&css&js 078 JavaScript 条件判断语句
条件判断语句是首先要接触的语句。通过条件判断来执行不同的代码块。
|
1月前
|
JavaScript 前端开发 编译器
编程笔记 html5&css&js 077 Javascript 关键字
编程笔记 html5&css&js 077 Javascript 关键字
|
1月前
|
JavaScript 前端开发
编程笔记 html5&css&js 076 Javascript 表达式
编程笔记 html5&css&js 076 Javascript 表达式
|
1月前
|
存储 JavaScript 前端开发
编程笔记 html5&css&js 075 Javascript 常量和变量
编程笔记 html5&css&js 075 Javascript 常量和变量