【发布时间】:2022-01-15 11:32:52
【问题描述】:
我正在解决一个递归问题。在解决问题时,我陷入了无法弄清楚的境地:
#include<bits/stdc++.h>
using namespace std;
vector<int> Search(int arr[],int in, int n, int t, vector<int> &v){//v passed as ref.
if(in == n){
return v;
}
if(arr[in] == t){
v.push_back(in);
}
return Search(arr, in+1, n, t, v);
}
int main(){
int arr[] = {1, 2, 3, 4, 5, 4, 7, 4, 9, 4};
vector<int> v;
v = Search(arr, 0, 10, 4, v);
for(int i = 0; i < v.size(); i++){
cout << v.at(i) << endl;
}
return 0;
}
在这段代码中,我传递了 v 作为引用,但是当我尝试在没有引用的情况下传递它时,有趣的是,两个代码都有效。
#include<bits/stdc++.h>
using namespace std;
vector<int> Search(int arr[], int in, int n, int t, vector<int> v){
if(in == n){
return v;
}
if(arr[in] == t){
v.push_back(in);
}
return Search(arr, in+1, n, t, v);
}
int main(){
int arr[] = {1, 2, 3, 4, 5, 4, 7, 4, 9, 4};
vector<int> v;
v = Search(arr, 0, 10, 4, v);
for(int i = 0; i < v.size(); i++){
cout << v.at(i) << endl;
}
return 0;
}
你能解释一下为什么会这样吗?
【问题讨论】:
-
你能解释一下为什么会这样吗? -- 你的意思是你的代码逻辑吗?使用调试器——无论是按值传递还是按引用传递,逻辑都不会受到影响。这与参考或价值之间的区别无关,只是无论如何,您的逻辑都不会受到任何影响。如果这是另一个问题,或者您以不同的方式实施您的解决方案,而参考/价值会有所不同,则情况并非如此。另外,
vector<int> Search——也起到了作用。 -
因为你使用的是返回的向量
-
在这两种情况下,您都按值返回。但是没有“默认通过引用传递”或类似的类型。值是按值传递的,除非你明确地通过引用传递。
-
无关,但你真的不应该使用
#include<bits/stdc++.h>。它不是标准的 C++,也不是可移植的。请改用#include<vector>。