递归与手动堆栈 - 在哪种情况下哪个是首选?

问题描述 投票:6回答:3

递归程序在内部创建堆栈,并使用户编写更少的代码。

除了上面提到的原因之外,是否有任何情况下递归实际上比手动堆栈更受欢迎?

编辑1:

动态内存分配以什么方式比递归程序在堆上的分配更“昂贵”?

performance data-structures recursion stack recursive-datastructures
3个回答
4
投票

当你说“代码少”时,我认为你提到的主要原因是设计的清晰度和简洁性。在具有局部变量和自动存储等功能的语言中,使用这些功能比将所有内容组织成自制堆栈更自然。 (毕竟,为什么要使用函数?为什么不使用if / elsewhile作为你唯一的控制结构编写整个程序?)

另一个考虑因素是性能,尤其是在多线程环境中。递归 - 取决于语言 - 可能使用the stack(注意:你说“在内部创建一个堆栈”,但实际上,它使用这些语言中的程序总是有的堆栈),而手动堆栈结构需要dynamic memory allocation,通常会有明显的性能损失 - 更不用说确保在(比如说)遇到异常时释放所有内存的额外复杂性。


3
投票

我大多同意@ ruakh的回答。我只想补充一点,使用系统堆栈会产生很多开销(实际上你每次执行时都需要比你需要的更多的状态)并且可能导致堆栈溢出非常深(但有界)递归,你可能会这样做避免使用显式堆栈,只推送您需要的状态。


0
投票

外部使用堆栈

vector<int> Solution::inorderTraversal(TreeNode* A) {
vector<int> res;
stack<TreeNode* > st;
TreeNode* root=A;
while(true)
{
    if(root==NULL)
    {
        if(st.empty())
        break;
        root=st.top();
        st.pop();
        res.push_back(root->val);
        root=root->right;


    }
    else
    {

        st.push(root);
        root=root->left;
    }
}
return res;

}

使用递归

void inorder(struct node* root)

但是在这里我们看到外部堆栈的使用节省了大量的处理时间,因此外部堆栈方法更快。

© www.soinside.com 2019 - 2024. All rights reserved.