javascript
JavaScript中递归使用
遞歸的概念
- 在程序中函數直接或間接調用自己
- 直接調用自己
- 簡介調用自己
- 跳出結構,有了跳出才有結果
遞歸的思想
- 遞歸的調用,最終還是要轉換為自己這個函數
- 如果有個函數foo,如果他是遞歸函數,到最后問題還是轉換為函數foo的形式
- 遞歸的思想就是將一個未知問題轉換為一個已解決的問題來實現
遞歸的步驟(技巧)
1. 假設遞歸函數已經寫好 2. 尋找遞推關系 3. 將遞推關系的結構轉換為遞歸體 4. 將臨界條件加入到遞歸體中7你簡單遞歸練習
求1-100的和
-
分析:
- 假設遞歸函數已經寫好為sum,既sum(100),就是求1-100的和
-
尋找遞推關系: 就是 n 與 n-1 ,或 n-2 之間的關系
1 var res = sum(100); 2 var res = sum(99) + 100;
sum(n) == sum(n-1) + n
將遞歸結構轉換成遞歸體
1 function sum(n){ 2 return sum(n-1) + n; 3 }- 求100 轉換為 求99
- 求99 轉換為 求98
- 求98 轉換為 求97
- ...
- 求2 轉換為 求1
- 求1 轉換為 求1
- 即 sum(1) = 1
遞歸函數
1 function sum(n){ 2 if(n==1) return 1; 3 return sum(n-1) + n; 4 }求出斐波那契數列
1,1,2,3,5,8,13,21,34,55,89...求第 n 項
-
分析:
1 function fib(n){ 2 if(n == 0 || n ==1) return 1; 3 return fib(n-1) + fib(n-2); 4 }
拷貝,使用遞歸方式(面試的時候有可能會問到)
(潘明老師:http://risky.love/2016/10/08/JavaScript%E6%B7%B1%E6%8B%B7%E8%B4%9D%E5%AE%9E%E7%8E%B0/)
- 分析
* 假設方法已經實現,如果 o2[key] 是對象
* 繼續使用這個方法
* 需要考慮 o2[key] 是引用類型,再一次使用clone函數
* 如果 o2[key] 不是引用類型,那么直接賦值
4.臨界條件
* 因為是 for in 循環,沒有成員遍歷時,自動結束
5. 遞歸函數
1 function clone(o1,o2){ 2 for(var key in o2){ 3 if(typeof o2[key] == 'object'){ 4 o1[key] = {}; 5 clone(o1[key],o2[key]) 6 }else{ 7 o1[key] = o2[key]; 8 } 9 } 10 }4.復雜實現(一個參數)
原理: clone(o) = new Object;
返回一個對象 遞歸函數
1 function clone(o){ 2 var temp = {}; 3 for(var key in o){ 4 if(typeof o[key] == 'object'){ 5 temp[key] = clone(o[key]); 6 }else{ 7 temp[key] = o[key]; 8 } 9 } 10 return temp; 11 }使用遞歸實現 getElementsByClassName
- 分析
1. 實現一個方法byClass()需要的參數是: node: 在某個節點上尋找元素 className: 需要尋找的className arr: 找到的元素存儲到這個數組中
2. 遍歷 node 的子節點,
3. 查看這個子節點是否還有子節點,如果沒有直接存儲到數組中,如果有就繼續遞歸
1 var arr = []; 2 function byClass(node, className, arr){ 3 //得到傳入節點的所有子節點 4 var lists = node.childNodes; 5 for(var i = 0;i< lists.length;i++){ 6 //判斷是否有相同className元素 7 if(arr[i],className == className){ 8 arr.push(arr[i]); 9 } 10 //判斷子節點是否還有子節點 11 if(arr[i].childNodes.length > 0){ 12 byClass(arr[i],className,arr); 13 } 14 } 15 }-
總結:
js遞歸通俗的理解:所謂的遞歸函數就是在函數體內調用本函數。使用遞歸函數一定要注意,要有結束條件,處理不當就會進入死循環.
轉載于:https://www.cnblogs.com/zwy-choo/p/6705429.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的JavaScript中递归使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树点涂色
- 下一篇: 转:精通JS正则表达式