【发布时间】:2021-05-01 12:09:13
【问题描述】:
我正在尝试查找两个数组的共同元素,但我得到了错误的结果。
我的错误在哪里?好像一切正常。
template<class T>
bool contains(T arr,int size, int num){
for(int i=0; i<size;++i)
if(arr[i] == num)
return true;
return false;
}
我正在尝试使用尾递归:
template <class T>
vector<T> cElemet(T ar1[], int s1, T ar2[], int s2){
vector<T> v;
if(s1 > 0)
v = cElemet(ar1,s1-1,ar2,s2);
if(contains(ar2,s2,ar1[s1-1])){
cout << "+" << ar1[s1-1] ;
v.push_back(ar1[s1-1]);
}
return v;
}
int main(){
int ar1[6] = {1,5,6,7,2,4};
int ar2[6] = {6,3,9,4,5,8};
std::vector<int> v = cElemet(ar1,6,ar2,6);
cout <<endl;
for(auto a : v)
cout << a << " ";
return 0;
}
【问题讨论】:
-
它对我有用。我不知道你认为它有什么问题。
-
未定义的行为(vide infra)有时似乎起作用。
-
当我运行 OP 的代码(MSVC)时,我得到了这样的输出:
8 5 6 4 -
为什么
ar1和ar2也不是std::vectors?尝试用向量和基于范围的 for 循环重写代码,你一开始就不会犯这个错误。 -
这不是尾递归——尾调用是函数中发生的最后一件事。 (即使你重写它,C++ 中析构函数的存在也很容易将看起来像尾调用的东西变成非尾调用。)