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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归与手动堆栈 - 在哪种情况下哪个是首选?相关的知识,希望对你有一定的参考价值。

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

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

编辑1:

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

答案

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

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

另一答案

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

另一答案

外部使用堆栈

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)

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

以上是关于递归与手动堆栈 - 在哪种情况下哪个是首选?的主要内容,如果未能解决你的问题,请参考以下文章

在哪种情况下首选 ICommand 和 Local:Mvx

C ++将向量传递给函数:引用与指针,哪个是首选? [复制]

在哪种情况下使用 JPA @JoinTable 注释?

CachedNetworkImage 和 CachedNetworkImageProvider 有啥区别?应该分别用在哪种情况下?

在哪种情况下应该在情节提要中使用 Popover segue?

在哪种情况下我们应该在 Erlang 中使用 The Hybrid Approach Socket?