JavaScript函数之递归
递归
递归的本质就是使用函数自身来解决问题的思路。
递归的定义(摘):
程序调用自身的编程技巧称为递归( 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函数之递归的更多相关文章
- 前端笔试题目总结——应用JavaScript函数递归打印数组到HTML页面上
数组如下: var item=[{ name:'Tom', age:70, child:[{ name:'Jerry', age:50, child:[{ name:'William', age:20 ...
- JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法
函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...
- 【授课录屏】JavaScript高级(IIFE、js中的作用域、闭包、回调函数和递归等)、MySQL入门(单表查询和多表联查)、React(hooks、json-server等) 【可以收藏】
一.JavaScript授课视频(适合有JS基础的) 1.IIFE 2.js中的作用域 3.闭包 4.表达式形式函数 5.回调函数和递归 资源地址:链接:https://pan.baidu.com/s ...
- javascript 函数初探 (一)--- 神马是函数
神马是函数? 所谓函数,本质上是一种代码的分组形式.我们可以通过这种形式赋予某组代码一个名字,以便与之后的调用.下面,我们来示范以下函数的声明: function sum(a, b){ var c = ...
- JavaScript语言精粹读书笔记 - JavaScript函数
JavaScript是披着C族语言外衣的LISP,除了词法上与C族语言相似以外,其他几乎没有相似之处. JavaScript 函数: 函数包含一组语句,他们是JavaScript的基础模块单元,用于代 ...
- javascript arguments与javascript函数重载
1.所 有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数.他不是一个数组,如果用typeof arguments,返回的是’object’.虽然我们可以用调用数据的方法来调用 ...
- javascript 函数详解2 -- arguments
今天我们接着上篇文章来继续javascript函数这个主题.今天要讲的是函数对像中一个很重要的属性--arguments. 相关阅读: javascript 函数详解1 -- 概述 javascrip ...
- 第八章:Javascript函数
函数是这样一段代码,它只定义一次,但可能被执行或调用任意次.你可能从诸如子例程(subroutine)或者过程(procedure)这些名字里对函数概念有所了解. javascript函数是参数化的: ...
- 深入浅出JavaScript函数 v 0.5
本文的观点是建立在<JavaScript权威指南 6th Ed> <JavaScript高级编程 3th Ed> <JavaScript精粹 2th Ed>之上, ...
随机推荐
- WebService学习--股票走势图+天气预报实现
互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取股票数据和天气预报为例进行学习 ...
- <CentOS7>如何设置hostname
在CentOS/RHEL 7中,有个叫hostnamectl的命令行工具,它允许你查看或修改与主机名相关的配置: ceph@client-node ~]$ hostnamectlstatus Stat ...
- [内存管理]管理图解v0.1 v0.2 v0.3
内存管理图解v0.1 内存管理图解v0.2 内存管理图解v0.3
- [进程管理]Linux进程状态解析之R、S、D
Linux是一个分时操作系统,能够在一个cpu上运行多个程序,每个被运行的程序实例对应一个或多个进程,这里介绍一下Linux进程状态. Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个 ...
- [ext4]03 磁盘布局 – Flexible group分析
Flexible Block Groups (flex_bg),我称之为"弹性块组",是EXT4文件系统引入的一个feature. 所谓Flexible Block Groups, ...
- SpringMVC中使用bean来接收form表单提交的参数时的注意点
这是前辈们对于SpringMVC接收表单数据记录下来的总结经验: SpringMVC接收页面表单参数 springmvc请求参数获取的几种方法 下面是我自己在使用时发现的,前辈们没有记录的细节和注意点 ...
- 【数据库系列学习一】Access与Excel的区别和联系
1.主题对一个主题Access只有一个表,而Excel可以有多个表.2.多表关系Access表各个表间存在严格的关联.Excel表各个表间的关系随意.3.数据计算Excel表中单元格中可以存储数据,也 ...
- eclipse 创建maven模块
先创建一个聚合模块. 勾选Create a simple project 点击finish . 看到已经创建好了这个聚合. 接下来我们创建子模块.pay-hk pay-web 两个字模块,前面一个是 ...
- PXC5.7集群部署
PXC三节点安装: node1:10.157.26.132 node2:10.157.26.133 node3:10.157.26.134 配置服务器ssh登录无密码验证 ssh-keygen实现 ...
- 重庆/北京/江苏KS/快乐时时/七星/福运来菠菜电商开奖修复APP网站SSC网站程序开发php
网站制作是指使用标识语言(markup language),通过一系列设计.建模.和执行的过程将电子格式的信息通过互联网传输,最终以图形用户界面(GUI)的形式被用户所浏览.简单来说,网页设计的目的就 ...