递归

递归的本质就是使用函数自身来解决问题的思路。

递归的定义(摘):

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

构成递归需具备的条件:

1. 子问题须与原始问题为同样的事,且更为简单。

2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。

首先用普通方式来解决问题:

有一堆桃子,猴子每天吃一半扔一个,第六天剩余1个,问开始有多少桃子

    var t=1;
    for(i=0;i<6;i++){
        t=(t+1)*2;
    }
    alert(t);

如果用for循环来解决问题,我们需要定义一个循环,循环六次,也就是六天,循环(前一天数量=当天数量加一乘以二),得出结果。

如果使用递归求第三天的数量:

    //递归
    //当天数量=(下一天数量+1)*2
    //函数明确:给一个天数,返回该天剩余数量
    function shuLiang(ts){
        if(ts==6){
            return 1;
        }
        return (shuLiang(ts+1)+1)*2;
    }
    alert(shuLiang(3));

在这里我们首先要明确:当天的数量=(下一天数量+1)*2

然后明确函数:给一个天数,返回该天剩余的数量

函数思路:

如果天数是6,返回1。

返回:当天数量=(下一天数量+1)*2

函数的运行过程是:

    //天数3,开始第一次计算
    function shuLiang(3){
        if(ts==6){
            return 1;
        }//天数不等于6,跳过
        return (shuLiang(3+1)+1)*2;//调用自身,天数=3+1,继续函数
    }
    //天数为4,第二次计算
        function shuLiang(4){
        if(ts==6){
            return 1;
        }//天数不等于6,跳过
        return (shuLiang(4+1)+1)*2;//调用自身,天数=4+1,继续函数
    }
    //天数为5,第三次计算
        function shuLiang(5){
        if(ts==6){
            return 1;
        }//天数不等于6,跳过
        return (shuLiang(5+1)+1)*2;//调用自身,天数=5+1,继续函数
    }
    //天数为6,第四次计算
        function shuLiang(3){
        if(ts==6){
            return 1;
        }//天数等于6,返回1
    }
    //第四次计算返回1到第三次计算中
        function shuLiang(5){
        return (1+1)*2;//天数等于1,返回(1+1)*2=4
    }
    //第三次计算返回4到第二次计算中
        function shuLiang(4){
        return (4+1)*2;//天数等于4,返回(4+1)*2=10
    }
    //第二次计算返回10到第一次计算中
        function shuLiang(3){
        return (10+1)*2;//天数等于10,返回(10+1)*2=22
    }
    //最后,返回第三天的数量为22

函数执行时,ts=3,然后进入函数

第一次计算:

ts不等于6,过

调用函数自身,ts=4,继续函数

第二次计算:

ts不等于6,过

调用函数自身,ts=5,继续函数

第三次计算:

ts不等于6,过

调用函数自身,ts=6,继续函数

第四次计算:

ts等于6,返回1

第四次计算返回1到第三次计算中,

第三次计算返回(1+1)*2=4到第二次计算中,

第二次计算返回(4+1)*2=10到第一次计算中

第一次计算返回(10+1)*2=22

得出第三天数量是22

使用递归的思路求文件夹下文件的数量

函数功能:给一个文件夹的路径,返回给文件夹下文件的数量

    function shuLiang(文件夹路径){
        var sum=0;
        if(是文件){
            sum++;
        }else{
            sum=sum+shuLiang(文件夹路径);
        }
    }

打开文件夹

如果遇到的是文件,数量+1

如果遇到的是文件夹,执行函数,打开文件夹,如果遇到的是文件,数量+1,如果遇到的是文件夹,执行函数……

JavaScript函数之递归的更多相关文章

  1. 前端笔试题目总结——应用JavaScript函数递归打印数组到HTML页面上

    数组如下: var item=[{ name:'Tom', age:70, child:[{ name:'Jerry', age:50, child:[{ name:'William', age:20 ...

  2. JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法

    函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...

  3. 【授课录屏】JavaScript高级(IIFE、js中的作用域、闭包、回调函数和递归等)、MySQL入门(单表查询和多表联查)、React(hooks、json-server等) 【可以收藏】

    一.JavaScript授课视频(适合有JS基础的) 1.IIFE 2.js中的作用域 3.闭包 4.表达式形式函数 5.回调函数和递归 资源地址:链接:https://pan.baidu.com/s ...

  4. javascript 函数初探 (一)--- 神马是函数

    神马是函数? 所谓函数,本质上是一种代码的分组形式.我们可以通过这种形式赋予某组代码一个名字,以便与之后的调用.下面,我们来示范以下函数的声明: function sum(a, b){ var c = ...

  5. JavaScript语言精粹读书笔记 - JavaScript函数

    JavaScript是披着C族语言外衣的LISP,除了词法上与C族语言相似以外,其他几乎没有相似之处. JavaScript 函数: 函数包含一组语句,他们是JavaScript的基础模块单元,用于代 ...

  6. javascript arguments与javascript函数重载

    1.所 有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数.他不是一个数组,如果用typeof arguments,返回的是’object’.虽然我们可以用调用数据的方法来调用 ...

  7. javascript 函数详解2 -- arguments

    今天我们接着上篇文章来继续javascript函数这个主题.今天要讲的是函数对像中一个很重要的属性--arguments. 相关阅读: javascript 函数详解1 -- 概述 javascrip ...

  8. 第八章:Javascript函数

    函数是这样一段代码,它只定义一次,但可能被执行或调用任意次.你可能从诸如子例程(subroutine)或者过程(procedure)这些名字里对函数概念有所了解. javascript函数是参数化的: ...

  9. 深入浅出JavaScript函数 v 0.5

    本文的观点是建立在<JavaScript权威指南 6th Ed> <JavaScript高级编程 3th Ed> <JavaScript精粹 2th Ed>之上, ...

随机推荐

  1. 七牛整合 ueditor (拦住那头牛,七牛又如何)

    最近遇到个项目,要求所有图片都必须整合到七牛上,看了把你谈文档踩在前辈们的基础上终于把他完成了,恰巧本屌丝最近刚好有时间,本着天下屌丝是一家的原则,和小朋友们一同学习 闲话少说入正题. 第一 :下载编 ...

  2. MongoDB副本集的常用操作及原理

    本文是对MongoDB副本集常用操作的一个汇总,同时也穿插着介绍了操作背后的原理及注意点. 结合之前的文章:MongoDB副本集的搭建,大家可以在较短的时间内熟悉MongoDB的搭建和管理. 下面的操 ...

  3. JDK内置日志系统

    1.Java应用中的日志功能 ================= 一般的Java应用程序中都有记录日志的需求,目前主流的记录日志的方法是在应用程序中引入log4j,用log4j来生成日志.其实,JDK ...

  4. 568. Maximum Vacation Days

    Problem statement:  LeetCode wants to give one of its best employees the option to travel among N ci ...

  5. [原创]JS实现数据筛选(each)

    做列表的时候,有时候需要按照某些条件进行查询,如班级,分组之类.但是又不想在重新从服务器获取数据,可以进行隐藏

  6. 让Unity的Inspector面板支持字符限制(restrict)功能

    今天在优化红点组件,笔者打算将红点id由10进制改为16进制处理,就打算将红点id字段由uint类型改成string类型,用于填写16进制的字符(因为在Inspector面板里,uint/int类型字 ...

  7. 转:Linux中文显示乱码?如何设置centos显示中文

    怎么设置Linux系统中文语言,这是很多小伙伴在开始使用Linux的时候,都会遇到一个问题,就是终端输入命令回显的时候中文显示乱码.出现这个情况一般是由于没有安装中文语言包,或者设置的默认语言有问题导 ...

  8. 求序列的和,杭电0j-2058

    原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=2058 [Problem Description] Given a sequence 1,2,3,... ...

  9. 读《Java并发编程的艺术》(二)

    上篇博客开始,我们接触了一些有关Java多线程的基本概念.这篇博客开始,我们就正式的进入了Java多线程的实战演练了.实战演练不仅仅是贴代码,也会涉及到相关概念和术语的讲解. 线程的状态 程的状态分为 ...

  10. SQL server 用命令行更改数据库

    (计应154兰家才) CREATE  DATABASE  数据库名 ON [PRIMARY] ( <数据文件参数> [,…n]  [<文件组参数>] ) [LOG ON] ( ...