javascript函数式编程--递归函数

递归运算  (使用尾递归可以避免递归的消耗内存的问题)

  递归是函数对自身的调用 

递归的组成:递归调用+递归终止条件(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.onload=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];

              }

}

   (未完待续。。。)

猜你喜欢

转载自blog.csdn.net/wenmin1987/article/details/82377273