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. LeetCode_Construct Binary Tree from Inorder and Postorder Traversal

    一.题目 Construct Binary Tree from Inorder and Postorder Traversal My Submissions Given inorder and pos ...

  2. Objective-C - NSInteger转换NSString

    NSInteger不是对象, 转换为long匹配64位系统, 再组成字符串(%ld). NSString *inStr = [NSString stringWithFormat: @"%ld ...

  3. php实现简单算法2

    php实现简单算法2 去弄php手册,里面有数据结构,有数据结构就好办了,我的算法基础那么好. 而且的话有数据结构的话再配合我脑中的那些算法了,我就都ok啦. 在手册里面搜索php数据结构就好 路径如 ...

  4. BZOJ 4236 set乱搞

    思路: 取个差 在set里面找 更新 (这个用map更好吧 但是我不会--) //By SiriusRen #include <set> #include <cstdio> # ...

  5. 图论:Tarjan算法

    在有向图中,若两点至少包含一条路径可以到达,则称两个顶点强连通,若任意两个顶点皆如此,则称此图为强联通图.非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected com ...

  6. R学习:《机器学习与数据科学基于R的统计学习方法》中文PDF+代码

    当前,机器学习和数据科学都是很重要和热门的相关学科,需要深入地研究学习才能精通. <机器学习与数据科学基于R的统计学习方法>试图指导读者掌握如何完成涉及机器学习的数据科学项目.为数据科学家 ...

  7. Yeslab 华为安全HCIE-第七门-Agile Controlle

    课程目录:   华为安全HCIE-第七门-Agile Controller(12篇)\1_aglie_controller产品亮点讲解.avi 华为安全HCIE-第七门-Agile Controlle ...

  8. IBM将收购Linux发行商红帽公司,继续发力云计算市场

    10月29日凌晨消息,IBM和Red Hat当地时间星期日联合宣布,IBM将以340亿美元收购红帽公司(Red Hat).根据两家公司发表的一份联合声明,IBM将以每股190美元的价格,以现金方式收购 ...

  9. mysql简单备份脚本

    #!/bin/bash #army.han #2016-11-11 #new_gj_DBbackup#备份路径配置 GSdir='/data/dbbackup/mysqlDB' TIME=`date ...

  10. BZOJ——1012: [JSOI2008]最大数maxnumber || 洛谷—— P1198 [JSOI2008]最大数

    http://www.lydsy.com/JudgeOnline/problem.php?id=1012|| https://www.luogu.org/problem/show?pid=1198 T ...