遞歸和深拷貝的總結運用

遞歸

遞歸的思想就是相信一個函數可以做到這個事情,然后利用這個函數來推之前的值完成這個事情

利用遞歸求n階層

階層的公式n!=123……(n-1)*n;n=0時:0!=1

  1. 我們要相信fn(n)是可以求到n的階層
  2. 然后看公式中n的階層等于(n-1)的階層乘以n
  3. 利用函數得到f(n-1)
        function strata(n){
            if(n==1||n==0){
                return 1;
            }
            else{
                return strata(n-1)*n;
            }
        }

利用遞歸求走樓梯的方法

題目如果有n個階梯,你每次都一節或者二節,有多少種走法

  1. fn(n)可以得到走到n級樓梯的走法
  2. 會想到n之前的最近的走法
  3. 最后如果走一節,到(n-1)節的時候,有f(n-1)種走法
  4. 如果最后走二節,到(n-2)之前就有f(n-2)中走法
  5. 所以到n的時候,總共有f(n-1)+f(n-2)
        function go(n){
            if(n==1||n==2){
                return 1
            }
            else{
                return go(n-1)+go(n-2);
            }
        }

原生深拷貝的方法

要理解為什么需要用深拷貝

  1. 基本類型和引用類型
  2. 賦值的時候 引用類型只是賦值了地址,而基本類型是賦值了值
  3. 完全拷貝,改變了新的對象的值,不會影響到原對象

只傳遞一個參數

        function deepCopy(obj){
            var newobj = {};
            if(typeof obj === 'object'&& obj instanceof Array){
                var newobj=[];
            }
            for(var key in obj){
                if(typeof obj[key] === 'object'){
                    newobj[key]=deepCopy(obj[key])
                }
                else{
                newobj[key]=obj[key];
            }
            }
            return newobj;
        }

一個新的對象一個老對象

        function deepCopy2(oldobj,newobj){
            var newobj = newobj || {};
            for(var i in oldobj){
                if (typeof oldobj[i]==='object') {
                    if(oldobj[i].constructor==='Array'){
                        newobj[i]=[];
                    }
                    else{
                        newobj[i]={};
                    }
                    deepCopy2(oldobj[i],newobj[i]);
                }
                else{
                    newobj[i]=oldobj[i];
                }
            }
            return newobj;
        }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容