用于检测阴性的递归解决方案?

时间:2014-10-10 08:21:57

标签: c++ loops

我正在编写一个程序来检测堆栈中的负数。下面的第一段代码迭代地实现了目标(我认为)。我现在试图递归地实现同样的目标。第二个片段是我到目前为止的...但是我无法使它成功运作。

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;
}

1 个答案:

答案 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);
}