c ++递归帮助

时间:2011-03-16 19:21:05

标签: c++ recursion vector

我遇到递归问题。任何人都可以告诉我如何将其转换为代码形式吗?

给予vector <int>值1,2,3,4,5,..

我想编写一个将所有值相互比较的函数。我现在不关心1 != 2等同于2 != 1

我在递归时非常糟糕

我保证这不是作业

修改 我想要做的是理清时间表的事件。我在同一天发生了多个事件,我想弄清楚时间表的所有排列

2嵌套for循环不起作用,因为我正在比较多个(&gt; 2)值

event 1 @ 0100-0230, or @ 0200-0330
event 2 @ 1200-1500, or @ 0800-1100
event 3 @ 1200-1300, or @ 1300-1400, or @ 1400-1500
.
.
.

对于每个比较,我想知道这组事件是否相交。我并不想找到一组所有不相交的事件

我希望得到像

这样的输出
event 1 @ 0100-2300, event 2 @ 0800-1100, event 3 @ 1200-1300 // will be printed out
event 2 @ 0200-0330, event 2 @ 1200-1500, event 3 @ 1200-1300 // will be ignored

3 个答案:

答案 0 :(得分:2)

我猜你正在调查递归和迭代之间的关系。通常,简单的迭代转换为尾递归 - 递归调用是你做的最后一件事的递归,所以不需要深度堆栈。

这是一个伪代码,加上它没有经过测试 - 但它应该有效。

void compareOne(int compareWith, iterator b, iterator e) {
    if (b == e) return;
    if (compareWith == *b) {
        // do something
    }
    compareOne(compareWith, b+1, e);
}


void compareAll(iterator b, iterator e) {
    if (b == e) return;
    compareOne(*b, b+1, e);
    compareAll(b+1, e);
}

答案 1 :(得分:1)

我打赌这是家庭作业......但我不明白为什么你需要递归:

for(int i = 0; i<v.size(); ++i)
{
   for(int j = i+1; j < v.size(); ++j)
   {
      compare v[i] and v[j]
   }
}

答案 2 :(得分:0)

为什么需要递归?简单的迭代就可以了:

using namespace std;
vector<int> v;
...
for (int i = 0; i < v.size() - 1; i++)
    for (int j = i + 1; j < v.size(); j++)
        if (v[i] == v[j])
            cout << "Oops" << endl;

或者您可以使用迭代器:

vector::const_iterator beforelast = v.end(); --beforelast;
for (vector::const_iterator i = v.begin(); i != beforelast; ++i)
    for (vector::const_iterator j = i + 1; j != v.end(); ++j)
        if (*i == *j)
            cout << "Oops" << endl;

一个可以尝试通过递归来解决问题:

bool f(vector<int>& v, int lastidx)
{
    int lastval = v[lastidx];
    for (int i = 0; i < lastidx; i++)
        if (v[i] == lastval)
            return false;
    return f(v, lastidx - 1);
}

然而,在我看来,非递归解决方案更好。