函式的遞迴

admin發表於2020-06-17

首先,解釋一下什麼是遞迴——程式呼叫自身的程式設計技巧稱為遞迴( recursion)。遞迴做為一種演算法在程式設計語言中廣泛應用。遞迴需要有邊界條件、遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。


下面舉一個經典的遞迴函式的例子:

[JavaScript] 純文字檢視 複製程式碼
function f(n){
    if(n == 0 || n == 1){
        return 1;
    }else{
        return n*f(n-1);
    }
}

那麼,根據上面的例子,我們來具體分析一下遞迴程式的基本步驟:

  1. 遞迴就是方法裡呼叫自身。

  2. 在使用遞增歸策略時,必須有一個明確的遞迴結束條件,稱為遞迴出口。

  3. 使用更簡單的子問題重新定義答案。我們可以將答案定義為當前節點的內容加上列表中其餘部分的和。

  4. 合併結果。遞迴呼叫之後,我們將當前節點的值加到遞迴呼叫的結果上。

由於在新專案中的需求,我就想到使用遞迴函式來實現,問題是這樣的:

給你一個陣列,陣列的每個元素都是一個物件,需要比較每個元素物件裡面的兩個屬性的值是否相同,如果相同,則合併該元素將裡面的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);

總結遞迴演算法解決問題的特點:

  • 遞迴就是方法裡呼叫自身。

  • 在使用遞增歸策略時,必須有一個明確的遞迴結束條件,稱為遞迴出口。

  • 遞迴演算法解題通常顯得很簡潔,但遞迴演算法解題的執行效率較低。所以一般不提倡用遞迴演算法設計程式。

  • 在遞迴呼叫的過程當中系統為每一層的返回點、區域性量等開闢了棧來儲存。遞迴次數過多容易造成棧溢位等,所以一般不提倡用遞迴演算法設計程式。

相關文章