function foo(){ ...foo(...)... }
1. 假設遞歸函數已經寫好 2. 尋找遞推關係 3. 將遞推關係的結構轉換爲遞歸體 4. 將臨界條件加入到遞歸體中
分析:html
var res = sum(100); var res = sum(99) + 100;
function sum(n){ return sum(n-1) + n; }
function sum(n){ if(n==1) return 1; return sum(n-1) + n; }
function foo(n){ return foo(n) = sum(n-1)+2; }
function foo(n){ if(n == 0) return 1; return foo(n-1) + 2; }
* 前 n 項的和 * 分析 1. 假設完成,sum(n)就是前n項的和 2. 遞推關係 * foo(n) = sum(n) + 第n-1項以前的和 3. 遞歸體
function sum(n){ return foo(n) + sum(n-1); }
4. 臨界條件 * n == 1 ,結果爲1 5. 遞歸函數
function foo(n){ if(n == 0) return 1; return foo(n-1) + 2; } function sum(n){ if(n == 0) return 1; return foo(n) + sum(n-1); }
function fn(n){ return fn(n) = (n-1) + 2 } function sum(n){ return sum(n) = fn(n) + sum(n-1); }
function fn(n){ if(n == 0) return 2; return fn(n-1) + 2; } function sum(n){ if(n==0) return 2; return fn(n) + sum(n-1); }
0 1 2 3 4 5 6 1, 1, 2, 4, 7, 11, 16,
* 若是從 1 開始
1 2 3 4 5 6 7 1, 1, 2, 4, 7, 11, 16
3. 遞歸體
function foo(n){ return foo(n-1)+n-1; }
4. 臨界條件 * foo(0) == 1; * foo(1) == 1; 5. 遞歸函數
function foo(n){ if(n == 0) return 1; return foo(n-1) + n -1; }
* 分析 1. 假設已知函數 sum(n)爲前n項和 2. 遞歸關係 * sum(n) = foo(n) + sum(n-1); 3. 遞歸體
function sum(n){ return foo(n) + sum(n-1); }
4. 臨界條件 * sum(0) = 1; 5. 遞歸函數
function sum(n){ if(n == 0) return 1; return foo(n) + sum(n-1); }
1,1,2,3,5,8,13,21,34,55,89...求第 n 項
function fib(n){ return fib(n-1)+fib(n-2); }
function fib(n){ if(n == 0 || n ==1) return 1; return fib(n-1) + fib(n-2); }
概念:
* 階乘是一個運算, 一個數字的階乘表示的是從 1 開始 累乘到這個數字.
* 例如 3! 表示 1 * 2 * 3
. 5! 就是 1 * 2 * 3 * 4 * 5
. 規定 0 沒有階乘,
* 階乘 從 1 開始.
* 分析:node
function foo(n){ return foo(n-1) * n }
function foo(n){ if( n == 1) return 1; return foo(n - 1) * n; }
function power(n,m){ return power(n,m-1) * n; }
function power(n,m){ if(m == 1) return n; return power(n,m-1) * n; }
概念:數組
function clone( o1, o2){ for(var key in o2){ o1[key] = o2[key]; } }
function clone(o1,o2){ for(var key in o2){ if(typeof o2[key] == 'object'){ o1[key] = {}; clone(o1[key],o2[key]) }else{ o1[key] = o2[key]; } } }
複雜實現(一個參數)
原理: clone(o) = new Object; 返回一個對象
遞歸函數函數
function clone(o){ var temp = {}; for(var key in o){ if(typeof o[key] == 'object'){ temp[key] = clone(o[key]); }else{ temp[key] = o[key]; } } return temp; }
html結構:
<div> <div>1 <div class="c">2</div> <div>3</div> </div> <div class="c">4</div> <div>5 <div>6</div> <div class="c">7</div> </div> <div>8</div> </div>
分析 1. 實現一個方法byClass()須要的參數是: node: 在某個節點上尋找元素 className: 須要尋找的className arr: 找到的元素存儲到這個數組中 2. 遍歷 node 的子節點, 3. 查看這個子節點是否還有子節點,若是沒有直接存儲到數組中,若是有就繼續遞歸
var arr = []; function byClass(node, className, arr){ //獲得傳入節點的全部子節點 var lists = node.childNodes; for(var i = 0;i< lists.length;i++){ //判斷是否有相同className元素 if(arr[i],className == className){ arr.push(arr[i]); } //判斷子節點是否還有子節點 if(arr[i].childNodes.length > 0){ byClass(arr[i],className,arr); } } }