即时学习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***)
我觉得这是一个平庸的解决方案,但我找不到另一种方式。
谢谢!
答案 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
。