1. 程式人生 > 實用技巧 >回撥函式和遞迴函式的應用

回撥函式和遞迴函式的應用

一.回撥函式

意義:回撥函式是一個函式的函式名作為另外一個函式的引數傳入,並且執行

目的:執行完一件事後,自動執行另外一個函式的事情。

舉例1:

function fn(f){
        console.log("bbb")  //fn1函式名作為fn的引數傳入,並執行
         f();
   }
 
 function fn1(){
       console.log("aaa");
  }
        fn(fn1);   //執行完列印bbb後,自動執行列印aaa

      結果:  bbb   aaa   

舉例2: 面對多個封裝好的函式時,可以自由選擇執行哪一個,不執行哪一個

    function fn1(a,b){
            return a+b;
        }
        function fn2(a,b){
            return a*b;
        }

        function fn(a,b,fn){
            fn(a,b);
        }

       var sum=fn(3,5,fn1);
       var s=fn(3,5,fn2);  
    console.log(sum,s) 結果: 8 15

舉例3: 函式的互相呼叫

 function
first(b,c,a){ setTimeout(function(){ console.log("紅燈") b(c,a,b); },1000) } function second(c,a,b){ setTimeout(function(){ console.log("綠燈"); c(a,b,c); },1000) } function third(a,b,c){ setTimeout(function
(){ console.log("黃燈"); a(b,c,a); },1000) } first(second,third,first); 結果: 紅燈 綠燈 黃燈 .........

這種使用方法是有些抽象的,如果不是很理解的,可以觀察其中規律,掌握規律後再來研究,方便許多。

二.遞迴函式

什麼是遞迴函式? 遞迴函式說簡單了就是: 函式自己執行自己

作用: 遍歷(適用多層結構)

遞迴有三類:廣度遞迴 深度遞迴 時間複雜度

1.廣度遞迴

  var obj = {
            a: 1,
            b: 2,
            c: {
                a: 3,
                b: 4,
                c: {
                    a: 5,
                    b: 6,
                    c: {
                        a: 7,
                        b: 8,
                        c: {
                            a: 9,
                            b: 10
                        }
                    }
                }
            }
        }

       function fn1(obj){
            for(var prop in obj){
                console.log(prop,obj[prop]);
                if(typeof obj[prop]==="object"){
                    fn1(obj[prop]);
                }
            }
       }                                       結果有些長,這裡就不寫了,自己列印吧

列印後很清楚的能看到,廣度遞迴就是一層一層的列印。

2.深度遞迴

深度遞迴分為三種,先序遍歷, 中序遍歷,後序遍歷 ,下面看例子(二叉樹)

        function createObj(_value){
            var o={};
            o.left=null;
            o.right=null;
            o.value=_value;
            return o;
        }

        var obj=createObj(1);
        obj.left=createObj(2);
        obj.right=createObj(3);
        obj.left.left=createObj(4);
        obj.left.right=createObj(5);
        obj.right.left=createObj(6);
        obj.right.right=createObj(7);   

a.先序遍歷

   function showObj(o){
            console.log(o.value);
            if(o.left)showObj(o.left);
            if(o.right) showObj(o.right);
            
        }

        showObj(obj);              結果是:1234567

b.中序遍歷

  function showObj(o){
            if(o.left)showObj(o.left);
            console.log(o.value);
            if(o.right) showObj(o.right);
            
        }

        showObj(obj); 結果是:4251637

c.後序遍歷

 function showObj(o){
            if(o.left)showObj(o.left);
            if(o.right) showObj(o.right);
            console.log(o.value);
            
        }

        showObj(obj);   結果是:4526731