无法在递归函数中生成正确的输出?

时间:2014-10-12 00:11:44

标签: c++ loops recursion

我正在尝试编写一个函数,以递归方式检测堆栈中的负整数。目前下面的代码片段就是我所拥有的,但到目前为止还没有给出正确的答案。我测试了一堆11个元素和7个底片并获得了下面给出的输出。循环结构肯定有问题,但我还没能找到并修复它。任何帮助将不胜感激!

12356657235681623569772357137235729723574562357617235777623579372358096

我的功能如下:

size_t r_func(stack<int> st1)
{   
    if(st1.size() == 0) return 0;
    int r = st1.top();
    st1.pop();
    cout << (r<0)+r_func(st1);
}

2 个答案:

答案 0 :(得分:1)

size_t r_func(stack<int> st1)
{   
    if(st1.size() == 0) return 0;
    int r = st1.top();
    st1.pop();
    cout << (r<0)+r_func(st1);
}

r_func应该返回size_t,但如果st1.size()不为零,那么它将不会返回任何内容。编译器应该给你一个警告!

要更正此问题,请添加一行以返回堆栈中的负数:

    ...
    st1.pop();
    const size_t neg_count = (r < 0) + r_func(st1);
    cout << neg_count;
    return neg_count;
}

修改:要编写此tail-recursively,有必要跟踪累加器中的大小(此处称为neg_accum):

size_t r_func(stack<int> st1, size_t neg_accum = 0)
{   
    if (st1.size() == 0) {
        cout << neg_accum;
        return neg_accum;
    }
    int r = st1.top();
    st1.pop();
    return r_func(st1, (r < 0) + neg_accum);
}

答案 1 :(得分:0)

正如Rufflewind所说,你应该替换'cout&lt;&lt;'使用'return'并以这种方式调用您的函数:'cout&lt;&lt; r_func(ST1);'