Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Программа на си  (Прочитано 3359 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Программа на си
« Ответ #45 : 16 Сентября 2014, 16:20:03 »
Думаю, что стоит пояснить, о каких рекурсивных функциях (не хвостовых) я говорил. Речь шла о рекурсивных функциях, имеющие возможность использовать в себе обычные циклы. Т.е. рекурсивная функция работает как цикл и вызывает другие, вложенные в неё циклы. Такой цикл применяется для работы с деревьями и графами.

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Программа на си
« Ответ #46 : 16 Сентября 2014, 16:25:44 »
unimix, вот поэтому я и говорил - не стоит изначально к разговору о циклах примешивать рекурсивность.... не стоит переусложнять простой вопрос.


Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1690
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Программа на си
« Ответ #47 : 17 Сентября 2014, 14:46:42 »
далеко не любая рекурсия может быть представлена циклом (иногда может быть очень сложно, а то и невозможно).
Примеры можно?
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Программа на си
« Ответ #48 : 17 Сентября 2014, 16:01:00 »
Protopopulus, обход произвольного дерева.

В принципе можно сделать и в цикле, только придется завести для этого довольно сложную динамическую структуру данных (с котрой и работать будет.... не легко...), что приведет к усложнению кода. Тогда как рекурсивное решение этой задачи изящно и просто в понимании.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1690
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Программа на си
« Ответ #49 : 17 Сентября 2014, 16:36:46 »
обход произвольного дерева.
Так и думал, что не будет достойного примера (не в обиду). Лично столкнулся один раз - делал дерево поиска (на чистом Си), в неблагоприятных случаях, программа падала с кончавшимся стеком. Да, данных было много, порядка 140 МиБ пар флоатов (координаты). После чего, переписал на условный цикл. Ничуть не сложнее. По-другому, но не сложнее. Просто добавляется FILO для точек возврата из ветви.
« Последнее редактирование: 17 Сентября 2014, 16:38:45 от Protopopulus »
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7205
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Программа на си
« Ответ #50 : 17 Сентября 2014, 17:12:15 »
Protopopulus, обход произвольного дерева самый достойный пример (можно устроить обход каталогов в файловой системе, да, теоретически, да и практически это можно сделать циклами, но это будет достаточно сложно). Но дерево может быть большим и стека не хватит, + цикл быстрее рекурсии, так что циклы лучше, но зачастую рекурсия намного проще.

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Программа на си
« Ответ #51 : 17 Сентября 2014, 17:13:31 »
Рекурсия бъет цикл наглядностью кода. Ресурсоемкостью - проигрывает однозначно.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1690
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Программа на си
« Ответ #52 : 17 Сентября 2014, 17:34:37 »
peregrine, Sly_tom_cat, я за всю свою практику так и не нашел алгоритма, реализуемого исключительно рекурсивно. Всегда (в моей практике) можно написать эквивалент на условном цикле. Просто это уже профессиональный интерес - найти исключительно рекурсивный алгоритм, применимый в практических целях.

Да и про наглядность не согласен. Типовой факториал...
Рекурсивно:
int f(int x) {
    if(x == 0) {
        return 1;
    } else {
        return x * factorial(x - 1);
    }
}
Циклом:
int f(int x) {
    int r = 1;

    while(x > 1) {
        r *= x;
        x--;
    }

    return r;
}
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Программа на си
« Ответ #53 : 17 Сентября 2014, 17:37:09 »
Protopopulus, дерево обойти (хотябы бинарное) тоже нагляднее циклом?
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1690
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Программа на си
« Ответ #54 : 17 Сентября 2014, 17:43:17 »
Sly_tom_cat, не столько нагляднее, сколько эффективнее. Просто привел пример (не более), который, в случае с циклом, проще для понимания - сразу видно, что перемножается ряд чисел и используется простейшая логика, в отличие от рекурсии.

UPD: И еще, смотря как напишешь... Кто-то рекурсивный обход напишет так, что мало кто поймет, кто-то цикл напишет понятный сразу же.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7205
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Программа на си
« Ответ #55 : 17 Сентября 2014, 18:22:49 »
Protopopulus, обойти можно циклом всегда, ЕМНИП, даже теорема такая есть, другое дело, что это может быть очень и очень трудно, что может сделать задачу нерешаемой за разумные сроки.

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Программа на си
« Ответ #56 : 17 Сентября 2014, 18:27:44 »
В ООП чаще можно встретить рекурсию. Например, для обработки некоего события в дереве объектов, унаследованных от одного класса. А там наследование, инкапсуляция, полиморфизм...
« Последнее редактирование: 17 Сентября 2014, 18:32:56 от unimix »

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7205
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Программа на си
« Ответ #57 : 17 Сентября 2014, 18:31:59 »
unimix, ага, в ООП больше ленятся писать код, но неоправданной рекурсии быть не должно нигде.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Программа на си
« Ответ #58 : 17 Сентября 2014, 23:59:14 »
Рекурсия это не goto в программе на япе высокого уровня...
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1690
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Программа на си
« Ответ #59 : 18 Сентября 2014, 15:02:58 »
Рекурсия это не goto в программе на япе высокого уровня...
Ага, это call или jmp в машинных инструкциях (читай goto).
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

 

Страница сгенерирована за 0.058 секунд. Запросов: 26.