递归运算 (使用尾递归可以避免递归的消耗内存的问题)
递归是函数对自身的调用
递归的组成:递归调用+递归终止条件(if语句来进行控制)
调用的形式:有直接调用 和 间接调用两种方式
直接调用:若果在调用函数f()的过程中,又要调用f()
间接调用:调用f1()的过程中又要调用f2(),而在调用f2()的过程中又要调用f1()
var f=function(x){
if(x<2)
return 1; //递归终止条件
else
return x*arguments.callee(x-1);//递归调用过程
}
alert(f(20));
文档树是一种递归的数据结构,使用递归计算指定节点所包含的全部节点body数
<body>
<script>
function f(n){//统计指定节点以及所有子节点的个数
var l=0;
if(n.nodeType==1)//如事子节点则计数
l++;
var child=n.childNodes;
for(var i=0;i<child.length;i++){
l+=f(child[i]);//递归统计当前节点下的所有子节点数
}
return l;//返回子节点数
}
window.οnlοad=function(){
var body=document.getElementsByTagName('body')[0];
alert(f(body))
}
</script>
</body>
尾递归算法:针对传统递归算法的一种优化算法,它是从最后开始的计算,每递归一次就算出相应的结果
即说,函数调用出现在函数的尾部,因为是尾部所以不用去保存任何局部变量,返回时,调用函数可以直接越过
调用者,返回到调用者的调用者
阶乘的普通线性递归运算:f(n),返回值会被调用者使用
function f(n){
return (n==1)?1:n*f(n-1)
}
alert(f(5))
尾递归:f(m,n),返回值不会被调用者调用
function f(n){
return (n==1)? 1:e(n,1);
}
function e(n,a){ //尾递归的状态完全由变量n和a保存
return (n==1)? a:e(n-1,a*n)
}
alert(f(5))
尾递归具有迭代特征,可改为:
var n=5;
var w=1;
for(var i=1;i<=5;i++){
w=w*i
}
alert(w)
Fibonacci(斐波那契数列):
//1斐波那契函数 递归方法
function fib(n){
if(n==1 || n==2){ retrun 1; }
if(n>2){ return fib(n-1)+fib(n-2); } }
//2.非递归形式的斐波那契数列
//用一个数组作为辅助的空间 //效率较高
function fib2(n){
if(n==1 || n==2){
return 1;
}else{
var arr =[]; arr[0]=1, arr[1]=1;
for(var i=2;i<n;i++){
var temp = arr[0]+arr[1];
arr[1] =arr[0]; arr[0] = temp;
}
return arr[0];
}
}
(未完待续。。。)