如何在递归函数

时间:2015-11-03 21:47:20

标签: c++ recursion iterator

即时学习c ++入门,在一个练习中,我必须做一个递归函数,在向量上打印元素。

我这样做了:

void printVector(vector<int>::iterator it1, vector<int>::iterator it2) {
cout << *it1 << " ";
if (it1 != it2-1)
    printVector((it1 + 1), it2);
}

是否有另一种形式来声明它,没有

if(it1!= ***IT2-1***)

我觉得这是一个平庸的解决方案,但我找不到另一种方式。

谢谢!

3 个答案:

答案 0 :(得分:4)

你的函数不接受空范围,它应该是,并且最好将退出条件放入递归函数的开头:

void printVector(vector<int>::iterator it1, vector<int>::iterator it2) 
{
     if( it1 == it2 ) return;
     cout << *it1++ << " ";
     printVector(it1, it2);
}

答案 1 :(得分:2)

是。

void printVector(vector<int>::iterator begin, vector<int>::iterator end)
{
    if (begin != end) {
        cout << *begin << " ";
        printVector(++begin, end)(;
    }
}

答案 2 :(得分:1)

是的,你可能想以另一种方式去做。当一个简单的循环可以做递归时,这是非常愚蠢的。相反,递归是一种工具,可用于更多的征服风格。即分为两部分,然后将相同的功能应用于第一部分,然后应用于第二部分。

通常你会有一些截止点,关于什么时候你可以实际做任何你想做的事情,比如说你有少于N个元素可以使用或类似。这个例子非常人为,因为它只会带来开销递归的开销。

if some_variable:

请原谅任何拼写错误和其他问题。哦,我也把它作为一个模板,以便它接受任何随机访问迭代器。这主要是因为两次输入template<class Iter> void printVector(Iter begin, Iter end) { const auto dist = std::distance(begin, end); if (0 == dist) { return; } else if (1 == dist) { std::cout << *begin; } else { // Find the middle auto pivot = begin + dist/2; // Apply to first part printVector(begin, pivot); // Print separator std::cout << " "; // Apply to second part printVector(pivot, end); } } 会感到很烦恼。顺便说一下,这应该是vector<int>::iterator