时间:2014-01-29 来源:

JavaScript的递归之递归与循环示例介绍

递归与循环

对于不同类型的需要重复计算的问题web外包,循环和递归两种方法各有所长,web外包能给出更直观简单的方案.另一方面,html前端制作循环和递归的方法可以互相转换.任何一个循环的代码都可以用递归改写,div页面实现相同的功能;反之亦然.在不失去其普遍性的前提下,承接网页前端外包可以把循环和递归分别用下列伪代码概括.

伪代码格式说明:循环采用while形式;变量不加定义;赋值用:=;条件表达式和执行的语句都写成函数的形式网页html切图排版,圆括号内写上相关的值.其他语法方面,网页html切图排版 arguments)){//循环条件,html切图报价也可能为了方便引入循环变量
//计算结果.参数包括之前的结果、当前循环变量和外部变量
result:=calculate(result, extern_variables);
//影响函数的外部环境网页切图制作, variable, extern_variables);
//执行完循环体中的语句后,网页重构报价修改参数或循环变量.
modify_arguments_variable(arguments, variable);
}
//返回结果
return result;
}

同样我们给出递归函数的伪代码.
复制代码 代码如下:

//pseudo code of a recursion
function recursion(arguments){
//以下代码为控制函数重复调用的结构部分.
//获得再次调用此函数的新的参数,承接网站前端可能为多组arguments值.
//对应于循环中的condition(variable, variable).
new_arguments:=conditional_get_next(arguments);
//对新参数的每一组web外包, variable, extern_variables);
result:=combine(result, results);
//影响函数的外部环境,手机网页外包即修改外部变量
changeStatus(result, extern_variables);
return result;
}

籍比较两段代码psd切图html,可以看出循环和递归具有相似的构成,psd切图html通过改变顺序和适当的变换web外包,任何循环都可以用递归的方式实现.程序简单时,web外包这种转换很容易看出.比如下面这个简单的累计求和函数:
复制代码 代码如下:

//loop
function sum(num){
var result=1;
while (num>1){
result+=num;
num--;
}
return result;
}

对应的递归形式:

复制代码 代码如下:

//recursion
function sum2(num){
if (num>1){
return num+sum(num-1);
}else{
return 1;
}
}

反之网页切图制作, b){
var temp;
if (a<b){
temp=a;
a=b;
b=temp;
}
var c=a%b;
while (c!==0){
a=b;
b=c;
c=a%b;
}
return b;
}

不过div+css+js切图,从递归到循环的转换并不是都这么容易.递归伪代码中的产生再次调用此函数的新参数部分

new_arguments:=conditional_get_next(arguments);

较之循环的对应部分更为灵活.可以按照新产生的参数组数(函数需要的所有参数为一组)将递归分为两类.第一类为参数组数固定,手机网页外包该递归可以转换为循环承接网站前端,比如斐波那契数列和最大公约数的例子;第二类为参数组数不确定——就像在遍历一个图或树的时候那样,承接网站前端每个点有任意个相邻的点——该递归不能直接转换为循环.

因为循环只能做一维的重复psd切图html,而递归可以遍历二维的结构.比如一棵树中,承接网页制作一个节点既有它的子节点web外包,也有同级的节点,web外包简单的一维循环不能够在两个方向上遍历.

但是如果我们在循环中借助某种数据结构记住有关节点位置的一些信息网页切图制作,返回具有给定class值的所有elements.包括Firefox3在内的一些浏览器已经支持该方法.下面我们先用递归的方法给出一个功能较弱的版本div+css+js切图, name){
var list=[];
function getElements(el){
if (el.className.split(' ').indexOf(name)>-1){
list.push(el);
}
for (var i=0, c=el.children; i<c.length; i++){
getElements(c[i]);
}
}
getElements(elem);
return list;
}

如前所述,承接网站前端在循环中为了记住节点的位置信息psd切图html,我们需要一个能实现以下方法的数据结构.

push(object) //写入一个对象.

objectpop() //读出最近写入的一个对象,psd切图html并将其从数据结构中删除.

objectget() //读出最近写入的一个对象web外包,不改变数据结构的内容.

堆栈正是这样一个后进先出的数据结构.Javascript中的Array对象支持前两种方法,div切图排版我们在为其增加第三个方法即可.

采用循环的版本:
复制代码 代码如下:

getElementsByClass.loop1 = function(elem,
num: 0
});
var parent, el;
while (true) {
parent = stack.get();
el = parent.pointer.children[parent.num];
if (el) {//enter a deeper layer of the tree
testElem(el);
stack.push({
pointer: el,
num: 0
});
}
else {//return to the upper layer
if (stack.pop().pointer === elem) {
break;
}
else {
stack.get().num += 1;
}
}
}

return list;
}

归纳起来.所有循环都可以用递归实现;所有递归都可以用循环实现.采用哪种方法,页面div重构由具体问题下哪种思路更方便直观和使用者的喜好决定.

效率

性能方面psd切图html,递归不比循环有优势.除了多次函数调用的开销,psd切图html在某些情况下web外包,递归还会带来不必要的重复计算.以计算斐波那契数列的递归程序为例.求第n项A(n)时,web外包从第n-2项起网页切图制作,每一项都被重复计算.项数越小,div页面重复的次数越多.令B(i)为第i项被计算的次数div+css+js切图, n-1

B(i)=B(i+1)+B(i+2); i<n-1

这样承接网站前端,B(i)形成了一个有趣的逆的斐波那契数列.求A(n)时有:

B(i)=A(n+1-i)

换一个角度来看,承接网站前端令C(i)为求A(i)时需要的加法的次数psd切图html, 1

C(i)=1+C(i-1)+C(i-1); i>1

令D(i)=C(i)+1, 1

D(i)=D(i-1)+D(i-1)

所以D(i)又形成一个斐波那契数列.并可因此得出:

C(n)=A(n+1)-1

而A(n)是以几何级数增长网页切图制作,这种多余的重复在n较大时会变得十分惊人.与之相对应的采用循环的程序,网页切图制作有

B(n)=1; n为任意值

C(n)=0; n=0, 1

C(n)=n-1; n>1

因而当n较大时,网页重构报价前面给出的采用循环的程序会比采用递归的程序快很多.

如上一节中的循环一样承接网站前端,递归中的这个缺陷也是可以弥补的.我们只需要记住已经计算出来的项,承接网站前端求较高项时psd切图html,就可以直接读取以前的项.这种技术在递归中很普遍,psd切图html被称为“存储”(memorization).

下面是采用存储技术的求斐波那契数列的递归算法.
复制代码 代码如下:

//recursion with memorization
function fibonacci4(n){
var memory = []; //used to store each calculated item
function calc(n){
var result, q;
if (n < 2) {
memory[n] = n;
return n;
}
else {
p = memory[n - 1] ? memory[n - 1] : calc(n - 1);
q = memory[n - 2] ? memory[n - 2] : calc(n - 2);
result = p + q;
memory[n] = result;
return result;
}
}
return calc(n);
}
点击次数:4744
作者:

其它web前端开发资讯

策略模式【综合】2018年01月22日正则表达式浅谈 【编程语言】2018年01月22日js分页工具 【Web前端】2018年01月22日CSP:使用CryptoAPI解码X509证书内容 【移动开发】2018年01月22日开始新的征程【系统运维】2018年01月22日lightoj1430-AQuestionofTime 【移动开发】2018年01月22日使用Maven_Jetty构建Struts2工程 【编程语言】2018年01月22日C++_静态成员【编程语言】2018年01月22日InstallGitonMac【编程语言】2018年01月22日(floyd1.1)hdu1217Arbitrage(使用floyd来求最长路——判断是否存在一种货币,经过一个兑换回路以后>=1单元)【编程语言】2018年01月22日总结一下一般游戏中3D模型各种勾边方法遇到的工程性问题 【编程语言】2018年01月22日字符串的奇偶性 【移动开发】2018年01月22日教你如何拒绝木马读取你的硬盘2018年01月22日卡巴斯基起诉新浪指其不正当报道2018年01月22日影视详细资料风行密而不宣的藏宝图2018年01月22日Android:平台恶意软件势头迅猛2018年01月22日
web前端行业资讯
Web new NewsList
微软发布WindowsServerBuild17074更新 ,,2018年01月18日凭借一个AI小功能,这款Google应用冲上苹果AppStore榜首 ,,2018年01月18日百度数据可视化实验室正式成立,发布深度学习可视化平台VisualDL ,,2018年01月18日OpenAI开源最新工具包,模型增大10倍只需额外增加20%计算时间 ,,2018年01月18日百度手机输入法8.0正式发布:支持多人语音速记 ,,2018年01月18日CSDN宣布收购TinyMind团队并升级为AI社区 ,,2018年01月18日甲骨文发布补丁修复英特尔芯片漏洞造成的问题 ,,2018年01月18日权威!官方发布CPU熔断和幽灵漏洞防范指引:附补丁下载 ,,2018年01月18日Oracle宣布新的JavaChampions ,,2018年01月18日Fedora28壁纸征集活动现已开幕:将持续至2月13日 ,,2018年01月18日苹果WebKit团队发布Speedometer2.0网页响应测试工具 ,,2018年01月18日百度输入法8.0后天发布:全感官AI输入 ,,2018年01月18日腾讯和乐高合作:共同研发智能玩具、游戏 ,,2018年01月18日HomePod上市日益临近智能音箱市场吸引力越来越大 ,,2018年01月18日英特尔公布修补漏洞后PC性能数据:8代CPU影响最小 ,,2018年01月18日云存储公司Dropbox秘密提交IPO申请估值超百亿美元 ,,2018年01月18日iPod之父:防手机上瘾无技术难度苹果谷歌应承担责任 ,,2018年01月18日芯片不安全英特尔云客户考虑转用AMD等对手处理器 ,,2018年01月18日2018年Java展望 ,,2018年01月18日区块链有多火?快播流量矿石遭20多万人疯抢 ,,2018年01月18日Intel搞定神经拟态芯片:模拟人类大脑、自主学习 ,,2018年01月18日阿里巴巴发布IoTConnect开放连接协议,盼推动语音互动入口普及 ,,2018年01月18日区块链火了,全球大佬们怎么看? ,,2018年01月18日Facebook正测试新功能主推本地新闻资讯 ,,2018年01月18日在GooglePlay中发现使用Kotlin开发的安卓恶意软件 ,,2018年01月18日VisualStudio201715.6预览版本2,增加新功能 ,,2018年01月18日百度陆奇:AI是5G最好的加速器 ,,2018年01月18日PinterestCEO:不同于谷歌和Facebook,我们走了第三条路 ,,2018年01月18日腾讯加码区块链项目已悄然注册“以太锁”商标 ,,2018年01月18日3D打印脑组织?科学家正在向这一目标正在前进 ,,2018年01月18日AdnroidStudio使用技巧 【移动开发】2014年12月23日linux下的mysql自动备份shell 【编程语言】2015年05月07日枚举和宏的区别详细解析2014年01月30日【从此不怕强制在线】二进制分组学习笔记 【综合】2015年08月24日第17周上机实践项目2——引用作形参 【编程语言】2014年12月22日Redis(Sentinel)监控集群安装部署【编程语言】2015年03月30日【Quick-COCOS2D-X3.3如何绑定自定义类至Lua之一】环境搭建2015年03月13日poj2663TriTilingdp水题【编程语言】2015年05月15日基于JQuery的简单实现折叠菜单代码2014年01月29日全栈工程师体能备战--知识面(1--20)【编程语言】2015年07月23日Excel批量自动填充行号 【研发管理】2015年04月02日2015年十项最热的IT技能 【编程语言】2014年12月19日智能数据提取工具Jailer3.7.10发布 ,,2016年06月23日会点网袁帅:O2O实际运用:二维码详解 【移动开发】2014年12月17日LeetCode_AddTwoNumbers 【编程语言】2015年04月17日Structual设计--Composite模式 【移动开发】2015年06月05日【扩展知识2】函数strlen()和非函数sizeof的使用【数据库】2014年11月27日《TCPIP详解》读书笔记(21章)-TCP的超时与重传 【综合】2015年03月20日delimiter的作用介绍【综合】2015年01月07日机房速度和带宽测试的简单方法2014年01月30日python的unittest测试框架的扩展浅谈 【综合】2015年07月24日javamail使用qq邮箱发邮件的配置方法2014年01月30日编译linux内核时出现"mkimage"commandnotfound-U-Bootimageswillnotbebuilt错误的解决办法【Web前端】2015年08月25日UICollectionView详解四:焦点图 【综合】2015年05月25日学习SEO优化之让百度天天及时更新网站2014年01月28日linux中的7个相关知识点与shell介绍2015年01月24日ruby局部变量2014年01月29日360称首批特供手机发售两小时售罄 ,,2016年06月23日poj2750--PottedFlower(线段树)【综合】2015年07月13日JAVA集锦(三)--Model1、Model2、三层架构的华丽转变【移动开发】2015年08月27日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)