2016-12-02 102 views
-1

我在這裏有一個遞歸函數,但它導致溢出錯誤,所以我需要將其更改爲非遞歸函數。任何幫助如何做到這一點將不勝感激!轉換遞歸函數

void MergeSort(struct node** headRef) 
{ 
    node* head = *headRef; 
    node* a; 
    node* b; 
    if ((head == NULL) || (head->next == NULL)) 
    { 
     return; 
    } 

    FrontBackSplit(head, &a, &b); 
    MergeSort(&a); 
    MergeSort(&b); 
    *headRef = SortedMerge(a, b); 
} 
+0

你研究過嗎? –

+0

這是一個學術問題嗎?否則,您可以在標準容器上使用STL'sort'。如果你喜歡這個鏈表實現,我們也需要看到'FrontBackSplit',我想,分析。 –

+0

是的,我必須使用鏈表。我把這個功能放在下面。 –

回答

1

在一般情況下,如果你有一個樹遞歸函數,溢出你的籌碼,一個簡單的方法把它改造成一個非遞歸一個(即,而不是使用堆)是基本上分配自己的堆棧。

您的每一次函數將調用本身帶有一些參數,而不是東西這些參數爲struct,並推送這個struct到工作隊列(我說的「排隊」,但實際的數據結構可能是一個std::stackstd::queue根據是否要以LIFO或FIFO順序處理項目)。現在你可以在一個迭代循環中調用你的函數:迭代該隊列直到它爲空,關閉每一組參數並用它們調用你的函數(這可以將新項目添加到工作隊列中)。