我正在编写一个程序来检测堆栈中的负数。下面的第一段代码迭代地实现了目标(我认为)。我现在试图递归地实现同样的目标。第二个片段是我到目前为止的...但是我无法使它成功运作。
int negcount = 0;
while(mystack.size() > 0) {
if(mystack.top() < 0) {
negcount++;
}
mystack.pop();
}
这就是我试图使函数递归的问题。循环设置的方式肯定有问题,但我不知道是什么......
size_t r_approach (stack<int> my_stack)
{
int cnt = 0;
while (mystack.size() > 0) {
if (mystack.top() >= 0) {
cout << " DO NOTHING" << endl;
mystack.pop();
} else {
cnt++;
mystack.pop();
r_approach(mystack);
}
}
cout << cnt << endl;
}
答案 0 :(得分:1)
如果您的解决方案假装是递归的,为什么while
循环?你应该使用递归迭代而不是循环:
size_t r_approach (stack<int> & mystack, size_t count)
{
if(mystack.size() == 0) return count;
int t = mystack.top();
mystack.pop();
return r_approach(mystack, count+(t<0));
}
请注意,为了避免在每次迭代中复制堆栈,mystack
参数现在作为参考传递。
您可能会发现奇怪count
也是一个参数。这是为了获得尾递归,这是一个很好的做法,因为一些编译器可以优化代码。
编辑(回答OP评论)
如果你想删除额外的参数(count)而你不需要尾递归,你可以使用返回值来保持计数:
size_t r_approach (stack<int> & mystack)
{
if(mystack.size() == 0) return 0;
int t = mystack.top();
mystack.pop();
return (t<0)+r_approach(mystack);
}
允许你保持尾递归的其他选项是包装我给你的初始实现:
size_t r_approach_imp (stack<int> & mystack, size_t count)
{
if(mystack.size() == 0) return count;
int t = mystack.top();
mystack.pop();
return r_approach_imp(mystack, count+(t<0));
}
size_t r_approach(stack<int> & mystack)
{
return r_approach_imp (mystack, 0);
}