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,如果遇到的是文件夹,执行函数……
- cron和crontab
- jboss上的soap web service开发示例
- 微信小程序与新零售相结合引流又出新方法啦!
- JAVA CDI 学习(2) - Scope 生命周期
- JAVA CDI 学习(3) - @Produces及@Disposes
- 3分钟带你学会git向github推送!
- JAVA CDI 学习(4) - @Alternative/@Default/@Any & Extension
- centos6.6 下安装mysql
- silverlight 4 tools for vs2010无法在vs2010 SP1上安装的解决办法
- find命令小结
- Python加圣诞帽
- 多次grep 没有看到输出
- java多线程 基础demo
- 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel 微信小程序后端搭建步骤详解
- Laravel使用swoole实现websocket主动消息推送的方法介绍
- Laravel框架Eloquent ORM删除数据操作示例
- PHP常用函数之base64图片上传功能详解
- laravel-admin 实现在指定的相册下添加照片
- Laravel框架Eloquent ORM修改数据操作示例
- PHP常用函数之格式化时间操作示例
- 在phpstudy集成环境下的nginx服务器下配置url重写
- 关于laravel-admin ueditor 集成并解决刷新的问题
- PHP常用函数之根据生日计算年龄功能示例
- Laravel 之url参数,获取路由参数的例子
- PHP call_user_func和call_user_func_array函数的简单理解与应用分析
- PHP常用函数之获取汉字首字母功能示例
- 浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
- tp5 实现列表数据根据状态排序