Использование двух рекурсивных функций вызывающих друг друга
Допустим есть такой код (немного измененный dfs):
#include <iostream>
#include <vector>
using namespace std;
vector <int> vec[100];
bool used[100];
int n;
void dfs(int v){
if (used[v])
return ;
used[v] = true;
for (int to : vec[v])
if (to < v) {
cout << "first action\n";
cout << "second action\n";
cout << "third action\n";
dfs(to);
}
for (int to : vec[v])
if (to > v) {
cout << "first action\n";
cout << "second action\n";
cout << "third action\n";
dfs(to);
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
int q;
cin >> q;
if (q)
vec[i].push_back(j);
}
}
dfs(1);
return 0;
}
Строчки
cout << "first action\n";
cout << "second action\n";
cout << "third action\n";
dfs(to);
повторяются 2 раза, поэтому возникает логичное желание вынести их в функцию. Получается такой код:
#include <iostream>
#include <vector>
using namespace std;
vector <int> vec[100];
bool used[100];
int n;
void f(int to){
cout << "first action\n";
cout << "second action\n";
cout << "third action\n";
dfs(to);
}
void dfs(int v){
if (used[v])
return ;
used[v] = true;
for (int to : vec[v])
if (to < v) {
f(to);
}
for (int to : vec[v])
if (to > v) {
f(to);
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
int q;
cin >> q;
if (q)
vec[i].push_back(j);
}
}
dfs(1);
return 0;
}
Но он, по понятным причинам, не работает.
Можно, конечно, выносить в функцию только 3 строчки:
cout << "first action\n";
cout << "second action\n";
cout << "third action\n";
И этот вариант работает. Но все таки остаются дублирующиеся куски кода:
f();
dfs(to);
Правильно ли я понимаю, что от таких повторений в данном случае избавиться нельзя?
Ответы (1 шт):
Автор решения: Jester
→ Ссылка
Добавьте объявление метода dfs() перед определением метода f()
void dfs(int v);
void f(int to){
cout << "first action\n";
cout << "second action\n";
cout << "third action\n";
dfs(to);
}
void dfs(int v){
///...
}