您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
进阶JavaScript之玩转递归与数列
 
作者: dunizb 来源:51CTO 发布于2016-10-10
  2815  次浏览      33
 

1、 什么是递归

在程序中,所谓的递归,就是函数自己直接或间接调用自己

1.1 直接调用自己

1.2 间接调用自己

就递归而言,最重要的是跳出结构,因为只有跳出结构才可以有结果。

1.3 所谓的递归就是化归思想

递归的调用,写递归函数,最终还是要转换为自己这个函数

加入有一个函数f,如果他是递归函数的话,也就是说函数体内的问题还是转化为 f 的形式。

递归思想就是将一个问题转换为一个已解决的问题来实现

例子:1,2,3,4,...,100,累加的结果

首先假定递归函数已经写好,假设是foo,即foo(100) 就是求1到100的和

寻找递推关系,就是n与n-1,或n-2之间的关系:foo( n ) == n + foo( n -1 )

将递推结果转换为递归体

将求100转换为求99

将求99转换为求98

...

将求2转换为求1

求1结果就是1

即:foo( 1 ) 是1

将临界条件加到递归体中

2、 递归求值举例

2.1 等差数列1

数列:求 1, 3, 5, 7, 9, ... 第 n 项的结果与前 n 项和. 序号从 0 开始

求第 n 项的值

首先假定递归函数已经写好, 假设是 fn. 那么 第 n 项就是 fn( n )

找递推关系: fn( n ) == f( n - 1 ) + 2

递归体

找临界条件

求 n -> n-1

求 n-1 -> n-2

...

求 1 -> 0

求 第 0 项, 就是 1

加入临界条件

前N项的和

假设已完成, sum( n ) 就是前 n 项和

找递推关系: 前 n 项和 等于 第 n 项 + 前 n-1 项的和

得到递归体

找临界条件

n == 1 结果为1

得到递归函数

2.2 等差数列2

数列:2, 4, 6, 8, 10 第 n 项与 前 n 项和

第n项

前n项和

2.3 差分数列

数列: 1, 1, 2, 4, 7, 11, 16, … 求 第 n 项, 求前 n 项和.

求第 n 项,从0开始

假设已经得到结果 fn, fn( 10 ) 就是第 10 项

找递推关系

第 0 项和第 1 项,相差0 => fn( 0 ) + 0 = fn( 1 )

第 1 项和第 2 项,相差1 => fn( 1 ) + 1 = fn( 2 )

第 2 项和第 3 项,相差2 => fn( 1 ) + 2 = fn( 2 )

...

第 n-1 项和第 n 项,相差n-1 => fn( n -1 ) + n -1 = fn( n )

递归体也就清楚了, 临界条件是 n == 0 => 1

如果从 1 开始表示, 那么第 n 项为

假设已经得到结果 fn, fn( 10 ) 就是第 10 项

找递推关系

第 1 项和第 2 项,相差0 => fn( 1 ) + 0 = fn( 2 )

第 2 项和第 3 项,相差1 => fn( 2 ) + 1 = fn( 3 )

第 3 项和第 4 项,相差2 => fn( 3 ) + 2 = fn( 4 )

...

第 n-1 项和第第 n 项,相差 n - 1 => fn( n -1 ) + n -2 = fn( n )

临界条件 n == 1 => 1

前n项和

2.4 斐波那契数列

这是最常见,面试最爱问的知识之一,斐波那契数列为:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

求其第 n 项

递推关系 fn(n) == fn( n- 1) + fn( n - 2),于是,递归函数为

3、高级递归

3.1 阶乘

计算阶乘是递归程序设计的一个经典示例。阶乘是一个运算,计算某个数的阶乘就是用那个数去乘包括 1 在内的所有比它小的数。例如,factorial(5) 等价于 5*4*3*2*1,而 factorial(3) 等价于 3*2*1。

5! 就是 1 * 2 * 3 * 4 * 5. 0 的阶乘是1, 阶乘 从 1 开始。

求 n 的阶乘

跟前面的1到100的求和的递归函数很相似,只是一个变种

3.2 求幂

求幂就是求 某一个数 几次方

2*2 2 的 平方, 2 的 2 次方

求 n 的 m 次方

最终要得到一个函数 power( n, m )

n 的 m 次方就是 m 个 n 相乘 即 n 乘以 (m-1) 个 n 相乘

4、递归深拷贝

如果要实现深拷贝,那么就需要考虑将对象的属性,与属性的属性,....都拷贝过来

4.1 简单实现

如果要实现:

假设已经实现clone( o1,o2 ),将对象 o2 的成员拷贝一份交给 o1

简单的算法,将 o2 的属性拷贝到 o1 中去

找递推关系,或叫化归为已解决的问题

假设方法已经实现,问一下,如果o2[ k ] 是对象

继续使用这个方法

因此需要考虑的是o2[ k ] 如果是引用类型,再使用一次clone()函数

如果o2[ k ] 不是引用类型,那么就直接赋值

如果实现一个方法byClass( node, 'c', list ),表示在某个节点上查找符合 class 属性为 c 的元素

在当前元素的子元素中查找,如果有符合要求的吗,存储早一个数组中

首先遍历子节点,然后看子节点是否还有子节点,如果没有直接判断,如果有再递归

   
2815 次浏览       33
相关文章 相关文档 相关课程



深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程
最新活动计划
嵌入式软件架构设计 12-11[北京]
LLM大模型与智能体开发实战 12-18[北京]
嵌入式软件测试 12-25[北京]
AI原生应用的微服务架构 1-9[北京]
AI大模型编写高质量代码 1-14[北京]
需求分析与管理 1-22[北京]

Android手机开发(一)
理解Javascript
非典型ajax实践
彻底的Ajax
javascript 使用Cookies
使用 jQuery 简化 Ajax 开发
更多...   

Struts+Spring+Hibernate
基于J2EE的Web 2.0应用开发
J2EE设计模式和性能调优
Java EE 5企业级架构设计
Java单元测试方法与技术
Java编程方法与技术

某航空公司IT部 JavaScript实践
某电视软件 HTML5和JavaScript
中航信 JavaScript高级应用开发
大庆油田 web界面Ajax开发技术
和利时 使用AJAX进行WEB应用开发
更多...