遞歸
遞歸的思想就是相信一個函數可以做到這個事情,然后利用這個函數來推之前的值完成這個事情
利用遞歸求n階層
階層的公式n!=123……(n-1)*n;n=0時:0!=1
- 我們要相信fn(n)是可以求到n的階層
- 然后看公式中n的階層等于(n-1)的階層乘以n
- 利用函數得到f(n-1)
function strata(n){
if(n==1||n==0){
return 1;
}
else{
return strata(n-1)*n;
}
}
利用遞歸求走樓梯的方法
題目如果有n個階梯,你每次都一節或者二節,有多少種走法
- fn(n)可以得到走到n級樓梯的走法
- 會想到n之前的最近的走法
- 最后如果走一節,到(n-1)節的時候,有f(n-1)種走法
- 如果最后走二節,到(n-2)之前就有f(n-2)中走法
- 所以到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);
}
}
原生深拷貝的方法
要理解為什么需要用深拷貝
- 基本類型和引用類型
- 賦值的時候 引用類型只是賦值了地址,而基本類型是賦值了值
- 完全拷貝,改變了新的對象的值,不會影響到原對象
只傳遞一個參數
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;
}