1 函数的调用
eg1:阶乘算法
var f = function (x) {
if (x === 1) {
return 1;
} else {
return x * f(x - 1);
}
};
function fn(n) {
if(n === 1) {
return 1;
}else{
return n*fn(n-1);
}
}
console.log(fn(10));
console.log(f(10));
    eg2:兔子繁衍算法  1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 
 var growRabbit = function(n) {
if(n<2) {
return n;
}else{
return growRabbit(n-1) + growRabbit(n-2);
}
};
var start1 = new Date().getTime();
console.log(growRabbit(10));
var end1 = new Date().getTime();
console.log("===="+(end1-start1)+ "====");
    基于本例斐波那契数列的扩展 动态规划
var growRabbit2 = function(n) {
var arr = [];
for(var i = 0;i <= n;i++) {
arr[i] = 0;
}
if(n == 1 || n ==2 ) {
return 1;
}else{
arr[1] = 1;
arr[2] = 2;
for(var j = 3;j <= n;j++) {//循环将会从3到输入的参数之间进行遍历,将数组的每个元素赋值为前两个元素之和, 循环结束, 数组的最后一个元素值即为最终计算得到的斐波那契数值
arr[j] = arr[j-1] + arr[j-2];
}
return arr[n-1];
}
//return arr[n-1];
};
var start2 = new Date().getTime();
console.log(growRabbit2(1000000));
var end2 = new Date().getTime();
console.log("===="+(end2-start2)+ "====");
经过反复的测试,如果没用动态规划如果求第50项的时候程序就会卡死,如果用第一种动态规划求第一百万的项数大概是60毫秒左右。
这种通过内部定义一个数组进行存储计算结果的方法大大缩减了程序的效率。类似与java经常使用的内部缓存数组的原理。 基于本例斐波那契数列的扩展 动态规划======迭代版本的斐波那契函数
var growRabbit3 = function(n){
var firstStep = 1;
var secondStep = 1;
var thirdStep = 1; for(var i = 2; i < n; i++){
thirdStep = firstStep + secondStep;
firstStep = secondStep;
secondStep = thirdStep;
}
return thirdStep;
};
var start3 = new Date().getTime();
console.log(growRabbit3(1000000));
var end3 = new Date().getTime();
console.log("===="+(end3-start3)+ "===="); 此种动态规划迭代版本的算法更加具有效率,同样第一百万的项数大概只有10毫秒的时间。来描述一下这种算法,大概想台阶一样,把所求的数比作一种台阶,前两个数之和就是第三个数依次迭代
 循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。
迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。
遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。
递归(recursion),指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列。 2 对象的调用
var obj1 = {
name : "Wunworld",
age : 25,
Fn : function(n) {
if(n === 1) {
return 1;
}else{
//return n*obj1.Fn(n-1);
//return n * this.Fn(n-1);//这种写法不好啦,在里面可以充分利用对象的this啦//这种写法不好啦,在里面可以充分利用对象的this啦
return n * arguments.callee(n-1);//函数内部的arguments对象,有一个callee属性,指向的是函数本身。可以使用arguments.callee在内部调用函数.
}
}
};
var obj2 = {
name : "Assassin",
Fn : obj1.Fn
};
console.log(obj1.Fn(5));
console.log(obj2.Fn(5));//函数的函数名申明需要相同
通过this关键字获取函数执行时的对象中的属性,这样执行obj2.fac时,函数内部便会引用obj2的fac属性。

还可以被任意修改对象来调用,那就是万能的call和apply:
obj3 = {};
console.log( obj1.Fn.call(obj3,5) );//(如果未采用arguments.callee()的调用会产生报错。。。)

js--递归详解的更多相关文章

  1. js对象详解(JavaScript对象深度剖析,深度理解js对象)

    js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...

  2. Java 递归详解

    递归详解: 1.递归一句话通俗讲就是一个方法自动重复调用自己的过程. 2.因为是重复调用自己了,所以看起来像一个循环,所以为了避免内存溢出系统崩溃,我们需要在方法里加一个返回值判断,用于递归循环的跳出 ...

  3. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

  4. Vue.js项目详解

    还是以Blog项目来讲解,最近我本人利用闲暇时间,以博客作为参考学习一些新的技术并尝试之前没有尝试过的思路来玩玩. 技术看似枯燥,但是带有一个目的来学,你会发现还是蛮有趣的. 主要实践的就是前后端分离 ...

  5. JS 面向对象详解

    面向对象详解1 OO1.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  6. 开胃小菜——impress.js代码详解

    README 友情提醒,下面有大量代码,由于网页上代码显示都是同一个颜色,所以推荐大家复制到自己的代码编辑器中看. 今天闲来无事,研究了一番impress.js的源码.由于之前研究过jQuery,看i ...

  7. 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...

  8. jquery图片切换插件jquery.cycle.js参数详解

    转自:国人的力量 blog.163.com/xz551@126/blog/static/821257972012101541835491/ 自从使用了jquery.cycle.js,我觉得再也不用自己 ...

  9. 值得收藏的js原型详解

    从虚无到Object 起初,地是空虚混沌,渊面黑暗:这时候一切还是null 神说,要有原型,于是就有了prototype 原型从凭空产生,于是需要一个指向于null的特征,人们把这种特征叫做隐式原型, ...

  10. 第三天:JS事件详解-事件流

    学习来源: F:\新建文件夹 (2)\HTML5开发\HTML5开发\04.JavaScript基础\6.JavaScript事件详解 学习内容:  1)基础概念 2)举例说明: 代码如上,如果用事件 ...

随机推荐

  1. usb芯片调试经验

    记录一下调试usb有关的芯片的一些经验. 1.有i2c的芯片.一般有i2c的地址选择. 检查地址选择是否正确,地址是多少.SCL和SDA上面是否有上拉电阻. 芯片的地址是几位的.I2c的时钟频率也是必 ...

  2. 用react native 做的一个推酷client

    用react native 做的一个推酷client 仅供大家參考.仅仅为抛砖引玉.希望大家能以此来了解react.并编写出很多其它的优质的开源库,为程序猿做出贡献. 用的的组件: Navigator ...

  3. windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)

    郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发.那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Ki ...

  4. CSS 相对/绝对(relative/absolute)定位与jQuery的控制显示隐藏

    曾经写显示隐藏老是用jq方法控制: dom.show(); dom.hide(); 事实上这样还是有非常多缺陷的. 这是html结构: <div class="holi"&g ...

  5. oracle job有定时执行功能

    oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务.   oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的 ...

  6. CloudFoundry 云平台部署

    CloudFoundry云平台部署 CloudFoundry(TheOpenSourceCloudOperatingSystem)距离发布已经一年多了作为第一个开源的PaaS平台日臻成熟.在这一年里C ...

  7. Web API总结

    1.Web API 控制器(Controller) 继承ApiController 2. Api 的 Url Map: api/{controller}/{id} 每个"Action&quo ...

  8. 记录一下Memcached的用法:

    首先就是先要配置Memcached,这个回头再写. https://zhidao.baidu.com/question/809745125827797732.html https://www.cnbl ...

  9. CSS3新的UI方案

    文本新增样式 一.opacity:指定了一个元素的透明度 0~1 二.新增颜色模式rgba:很好的解决了背景透明,字体颜色不透明的需求. 三.文字阴影:text-shadow用来为文字添加阴影,而且可 ...

  10. 运输层协议——UDP

    UDP概述: UDP只是做了运输层协议能做的最少工作,仅做了复用/分解,少量的差错检验. UDP是无连接的. UDP优点: 关于何时.发送什么数据的应用层控制更为精细:TCP在拥堵时会遏制发送方的发送 ...