递归与手动堆栈 - 在哪种情况下哪个是首选?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归与手动堆栈 - 在哪种情况下哪个是首选?相关的知识,希望对你有一定的参考价值。
递归程序在内部创建堆栈,并使用户编写更少的代码。
除了上面提到的原因之外,是否有任何情况下递归实际上比手动堆栈更受欢迎?
编辑1:
动态内存分配以什么方式比递归程序在堆上的分配更“昂贵”?
当你说“代码少”时,我认为你提到的主要原因是设计的清晰度和简洁性。在具有局部变量和自动存储等功能的语言中,使用这些功能比将所有内容组织成自制堆栈更自然。 (毕竟,为什么要使用函数?为什么不使用if
/ else
和while
作为你唯一的控制结构编写整个程序?)
另一个考虑因素是性能,尤其是在多线程环境中。递归 - 取决于语言 - 可能使用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)
但是在这里我们看到外部堆栈的使用节省了大量的处理时间,因此外部堆栈方法更快。
以上是关于递归与手动堆栈 - 在哪种情况下哪个是首选?的主要内容,如果未能解决你的问题,请参考以下文章
C ++将向量传递给函数:引用与指针,哪个是首选? [复制]
CachedNetworkImage 和 CachedNetworkImageProvider 有啥区别?应该分别用在哪种情况下?