函式的遞迴
首先,解釋一下什麼是遞迴——程式呼叫自身的程式設計技巧稱為遞迴( recursion)。遞迴做為一種演算法在程式設計語言中廣泛應用。遞迴需要有邊界條件、遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。
下面舉一個經典的遞迴函式的例子:
[JavaScript] 純文字檢視 複製程式碼function f(n){ if(n == 0 || n == 1){ return 1; }else{ return n*f(n-1); } }
那麼,根據上面的例子,我們來具體分析一下遞迴程式的基本步驟:
遞迴就是方法裡呼叫自身。
在使用遞增歸策略時,必須有一個明確的遞迴結束條件,稱為遞迴出口。
使用更簡單的子問題重新定義答案。我們可以將答案定義為當前節點的內容加上列表中其餘部分的和。
合併結果。遞迴呼叫之後,我們將當前節點的值加到遞迴呼叫的結果上。
由於在新專案中的需求,我就想到使用遞迴函式來實現,問題是這樣的:
給你一個陣列,陣列的每個元素都是一個物件,需要比較每個元素物件裡面的兩個屬性的值是否相同,如果相同,則合併該元素將裡面的count計數屬性值相加。
下面就貼上答案:
[JavaScript] 純文字檢視 複製程式碼/** * uniqueData * arr -> 傳入的陣列,[注:此陣列的每個元素都是一個物件,各元素的屬性相同值不同] * field -> 傳入比較的屬性值,[field是一個陣列] * count -> 傳遞需要處理的屬性鍵,[注;count屬性值必須為number,以作統計] * jsonArray -> 存入去重合並後的元素 */ let jsonArray = []; // 去重合並 let uniqueData = function(arr,field,count){ let narr = arr if(narr.length > 1){ let first = narr.shift(); if(narr.length > 0){ let next = narr.findIndex((value,index,array)=>{ return field.map((val,index)=>{ return first[val] == value[val] }).reduce((prev,next) => prev&&next ) }) if(next >= 0){ first[count] += parseInt(narr[next][count]); narr.splice(next,1); narr.splice(0,0,first); uniqueData(narr,field,count); }else{ jsonArray.push(first); uniqueData(narr,field,count); } }else{ jsonArray.push(first) } }else{ jsonArray.push(narr[0]) } } // 模擬資料 var data = [ { count:1, selected:0, subselectd:1, stock:22 },{ count:2, selected:0, subselected:1, stock:22 },{ count:1, selected:1, subselected:2, stock:11 },{ count:3, selected:0, subselected:1, stock:22 },{ count:1, selected:1, subselected:2, stock:11 } ]; uniqueData(data,['selected','subselected'],'count'); console.log(jsonArray);
總結遞迴演算法解決問題的特點:
遞迴就是方法裡呼叫自身。
在使用遞增歸策略時,必須有一個明確的遞迴結束條件,稱為遞迴出口。
遞迴演算法解題通常顯得很簡潔,但遞迴演算法解題的執行效率較低。所以一般不提倡用遞迴演算法設計程式。
在遞迴呼叫的過程當中系統為每一層的返回點、區域性量等開闢了棧來儲存。遞迴次數過多容易造成棧溢位等,所以一般不提倡用遞迴演算法設計程式。
相關文章
- 遞迴函式遞迴函式
- 遞迴函式的理解遞迴函式
- 函式表示式–遞迴函式遞迴
- JavaScript 函式遞迴JavaScript函式遞迴
- php遞迴函式PHP遞迴函式
- 函式之遞迴函式遞迴
- 函式遞迴與生成式函式遞迴
- 第 8 節:函式-匿名函式、遞迴函式函式遞迴
- 初學 PHP 函式的遞迴PHP函式遞迴
- Python 函式進階-遞迴函式Python函式遞迴
- JS函式表示式——函式遞迴、閉包JS函式遞迴
- 1.5.6 python遞迴函式Python遞迴函式
- 13.0、python遞迴函式Python遞迴函式
- day 17 – 1 遞迴函式遞迴函式
- 遞迴函式例項大全遞迴函式
- 遞迴函式-樹形列表遞迴函式
- JavaScript 中匿名函式的遞迴呼叫JavaScript函式遞迴
- SQL with as 的用法 以及遞迴函式的寫法 遞迴層次查詢SQL遞迴函式
- C#語言函式遞迴C#函式遞迴
- GO語言————6.6 遞迴函式Go遞迴函式
- 直觀理解(尾)遞迴函式遞迴函式
- 遞迴函式,可變引數列表遞迴函式
- php 遞迴函式的三種實現方式PHP遞迴函式
- 測開之函式進階· 第1篇《遞迴函式》函式遞迴
- 課時22:函式:遞迴是神馬函式遞迴
- bilibiliclass10and11_函式遞迴函式遞迴
- 假如我們把函式都改成遞迴...函式遞迴
- sql 函式實現三種父子遞迴SQL函式遞迴
- 函式的遞迴及科赫曲線繪製函式遞迴
- 遞迴、三元表示式、生成式(列表,字典)、匿名函式遞迴函式
- 從漢諾塔遊戲理解python遞迴函式遊戲Python遞迴函式
- 編寫函式:遞迴求逆序 (Append Code) ★函式遞迴APP
- 遞迴匿名函式手動實現 http_build_query 系統函式遞迴函式HTTPUI
- 『無為則無心』Python函式 — 32、遞迴Python函式遞迴
- Python3之遞迴函式簡單示例Python遞迴函式
- 遞迴函式原理 技能包瞭解一下遞迴函式
- 遞迴示例-展開編號(Excel函式集團)遞迴Excel函式
- Hellow C# unity學習記錄(8)函式的遞迴C#Unity函式遞迴