Использование двух рекурсивных функций вызывающих друг друга

Допустим есть такой код (немного измененный 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){
    ///...
}
→ Ссылка