Рекурсивный спуск/возврат С++

541
26 ноября 2016, 19:08

Не могли бы объяснить отличие выполнение кода на рекурсивном спуске и возврате (с примером)? Как вообще определить, что программа выполняется на рек. спуске или возврате? Материала с примерами в интернете почти нет, только еще больше запутался. Можно увидеть один и тот же алгоритм, но написанный на рек. спуске и возврате? Спасибо за помощь, очень надо разобраться.

Answer 1

Примером рекурсивного возврата может служить функция вычисляющая факторал:

#include <iostream>
using namespace std;
int fact(int x)
{
    int mult;
    if (x == 1)
        mult = 1;
    else
        mult = fact(x - 1);
    // результат вычисляется посредством рекурсивного возврата
    return mult * x;
}
int main(int argc, char *argv[])
{
    int n = 5;
    cout << "Fact !n = " << fact(n) << endl;
    return 0;
}

Примером рекурсивного спуска может служить программа построения дерева каталогов.

#include <iostream>
#include <list>
using namespace std;
list<string> get_subdirs(const string &path)
{
    // какая-то реализация получения списка каталогов, зависимая от ОС
}
string path_concat(const string &path, const string &name)
{
    // какая-то реализация склеивания пути с именем, напр.: C:\\Users + Admin = C:\\Users\\Admin
}
string indent(int level)
{
    // сформировать отступ
    string result;
    for (size_t i = 0 ; i < level; ++i)
        result += '-';
    return result;
}
void print_directory(const string &path, int level = 1)
{
    list<string> subdirs = get_subdirs(path);
    for (list<string>::iterator it = subdirs.begin(); it != subdirs.end(); ++it)
    {
        string dir = *it;
        cout << indent(level) << dir << endl;
        print_directory(path_concat(path, dir), level + 1);
    }
}
int main(int argc, char *argv[])
{
    print_directory("C:\\");
    return 0;
}

Код писал на коленке, корректность не гарантирую.

READ ALSO
Книги и другая литература по С++

Книги и другая литература по С++

В этом вопросе собирается литература по языку C++

449
Не получается получить имя файла в gtkmm (виджет FileChooserButton)

Не получается получить имя файла в gtkmm (виджет FileChooserButton)

Это мой код, когда я выбираю файл срабатывает callback, но функция get_filename возвращает пустую строку ""

224
Не выводит имя двоечника

Не выводит имя двоечника

должно вывести фамилию Shevcenko но не работает не могу разобраться

176