js--递归详解
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--递归详解的更多相关文章
- js对象详解(JavaScript对象深度剖析,深度理解js对象)
js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...
- Java 递归详解
递归详解: 1.递归一句话通俗讲就是一个方法自动重复调用自己的过程. 2.因为是重复调用自己了,所以看起来像一个循环,所以为了避免内存溢出系统崩溃,我们需要在方法里加一个返回值判断,用于递归循环的跳出 ...
- Node.js npm 详解
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
- Vue.js项目详解
还是以Blog项目来讲解,最近我本人利用闲暇时间,以博客作为参考学习一些新的技术并尝试之前没有尝试过的思路来玩玩. 技术看似枯燥,但是带有一个目的来学,你会发现还是蛮有趣的. 主要实践的就是前后端分离 ...
- JS 面向对象详解
面向对象详解1 OO1.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- 开胃小菜——impress.js代码详解
README 友情提醒,下面有大量代码,由于网页上代码显示都是同一个颜色,所以推荐大家复制到自己的代码编辑器中看. 今天闲来无事,研究了一番impress.js的源码.由于之前研究过jQuery,看i ...
- 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...
- jquery图片切换插件jquery.cycle.js参数详解
转自:国人的力量 blog.163.com/xz551@126/blog/static/821257972012101541835491/ 自从使用了jquery.cycle.js,我觉得再也不用自己 ...
- 值得收藏的js原型详解
从虚无到Object 起初,地是空虚混沌,渊面黑暗:这时候一切还是null 神说,要有原型,于是就有了prototype 原型从凭空产生,于是需要一个指向于null的特征,人们把这种特征叫做隐式原型, ...
- 第三天:JS事件详解-事件流
学习来源: F:\新建文件夹 (2)\HTML5开发\HTML5开发\04.JavaScript基础\6.JavaScript事件详解 学习内容: 1)基础概念 2)举例说明: 代码如上,如果用事件 ...
随机推荐
- Windows安装两个mysql数据库步骤
因为新旧项目数据库版本号差距太大.编码格式不同.引擎也不同,所以仅仅好装两个数据库. 本次安装两个mysql数据库.版本号各自是4.0.18,5.5.36.都是可运行文件直接安装. 本机上之前已经安装 ...
- Java编程手冊-Collection框架(下)
建议先看Java编程手冊-Collection框架(上) 5. Set<E>接口与实现 Set<E>接口表示一个数学的集合,它不同意元素的反复,仅仅能包括一个null元素. ...
- 利用photoshop的动作功能实现图片批处理操作
首先,通过"窗体菜单"点击"动作".启动动作栏. 然后.通过动作栏的菜单,新建动作. 接着,完毕一个标准操作,包含打开图像,图像处理或者格式转换,另存为,等. ...
- vue --- cli build 后的项目,图片路径出错
今天在插入背景图片过程中,遇到了路径错误的问题,通过网上查询,找到了解决的办法,但是大部分都没有讲造成这种问题的原因,故我简单地总结了一下,并加入了一些自己的理解,欢迎共同探讨~ 当用vue-cli自 ...
- 深入Vue的响应式原理
工作的过程中,有时候会有数据改变但是视图没有更新的问题,作者在vue的官方文档中有提到这个问题,我来总结一下 1.vue的每个组件实例都有对象的watcher实例对象,它会在组件渲染的过程中把属性记录 ...
- Aizu - 2555 Everlasting Zero 模拟
Aizu - 2555 Everlasting Zero 题意:学习技能,每个技能有不同的要求,问能否学习全部特殊技能 思路:枚举每两个技能,得到他们的先后学习关系,如果两个都不能先学的话就是No了, ...
- img下面的留白解决
在做网页的时候经常会出现一个令人困惑的现象.那就是行内元素和块级元素之间会出现“留白”.就是块级元素中明明只有一个行内元素,但行内元素却不会铺满块级元素.像这个例子: “留白”出现的原因 行内元素默认 ...
- qt qlineedit只输入数字
lineEdit->setValidator(new QRegExpValidator(QRegExp("[0-9]+$")));
- 洛谷—— P1086 花生采摘
https://www.luogu.org/problem/show?pid=1086#sub 题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着 ...
- android反编译odex文件
关于android的反编译工具,相信大家并不陌生 如APK-TOOL,dex2jar APK-TOOL 用于反编译出布局文件 下载地址http://code.google.com/p/android- ...