2016-12-02 83 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顺序处理项目)。现在你可以在一个迭代循环中调用你的函数:迭代该队列直到它为空,关闭每一组参数并用它们调用你的函数(这可以将新项目添加到工作队列中)。