递归
递归的本质就是使用函数自身来解决问题的思路。
递归的定义(摘):
程序调用自身的编程技巧称为递归( 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,如果遇到的是文件夹,执行函数……