Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/76: Рейтинг темы: голосов - 76, средняя оценка - 4.58
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 55

Что такое рекурсия? Зачем она нужна?

02.07.2013, 19:52. Показов 16689. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Объясните пож человеческим языком, что такое Рекурсия.

Я знаю что это вызов функции самой себя.
Но всё равно не могу догнать зачем она нужна.

Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.07.2013, 19:52
Ответы с готовыми решениями:

Что такое виртуальная функция и зачем она нужна?
Мне с трудом пришлось понять, пока не прочитал книгу и не проработал код на виртуальных функциях. В этой теме хочу новичкам рассказать,...

Что такое тестирующая программа и зачем она нужна?
Есть задание, Написать функцию для перевода переменной типа long в символьную строку в двоичном представлении ( ltoab( long num, char s)...

Что делает функция compare в коде и зачем она нужна в qsort
Объясните, пожалуйста, что делает функция compare (17 строка) в данном случае и зачем она нужна в qsort? #include <stdio.h> ...

41
118 / 80 / 1
Регистрация: 10.08.2011
Сообщений: 664
02.07.2013, 20:00
Это одно из многих определений в учебниках, которое крайне редко используется на практике.
В педевикии лаконично описано, но маловероятно повстречать сие в реалиях.
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
02.07.2013, 20:04
Цитата Сообщение от Second Посмотреть сообщение
маловероятно повстречать сие в реалиях.
да ну... та же широко используемая сортировка quicksort рекурсивная. обработка бинарных деревьев чаше всего рекурсивна и многое другое.
0
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 55
02.07.2013, 20:10  [ТС]
Цитата Сообщение от Thinker Посмотреть сообщение
да ну... та же широко используемая сортировка quicksort рекурсивная. обработка бинарных деревьев чаше всего рекурсивна и многое другое.
расскажите о рекурсии по подробнее пож
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
02.07.2013, 20:16
sancho1996, это просто вызов функции самой себя. Допустим:
C++
1
2
3
4
5
6
bool f(int x)
{
if (x == 1) return false;
else
f(x - 1);
}
Функция будет вызывать себя -ндцать раз, до тех пор пока не вызовет с числом, равным 1, а затем вызов прекратится.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.07.2013, 20:40
Много лишнего для примера..
C++
1
2
3
4
5
void func( int n )
{
    if ( !n ) return; // если n == 0 ...
    func( n - 1 );
}
Собственно, она ничего не делает, просто пример работы рекурсии.
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
02.07.2013, 20:45
Цитата Сообщение от lazybiz Посмотреть сообщение
она ничего не делает, просто пример работы рекурсии.
вот откуда потом появляются фразы типа

Цитата Сообщение от Second Посмотреть сообщение
Это одно из многих определений в учебниках, которое крайне редко используется на практике... маловероятно повстречать сие в реалиях.
0
02.07.2013, 20:52

Не по теме:

Thinker, ))))))

0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
13.05.2017, 09:18
Цитата Сообщение от Thinker Посмотреть сообщение
да ну... та же широко используемая сортировка quicksort рекурсивная. обработка бинарных деревьев чаше всего рекурсивна и многое другое.
Подскажите нужна ли рекурсия в С++
ЕСЛИ её можно заменить for ?
0
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
13.05.2017, 11:29
Цитата Сообщение от eXPonent Посмотреть сообщение
Подскажите нужна ли рекурсия в С++
ЕСЛИ её можно заменить for ?
очевидно же что нет, ибо stack overflow!
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
13.05.2017, 11:47
Цитата Сообщение от eXPonent Посмотреть сообщение
ЕСЛИ её можно заменить for ?
Цитата Сообщение от Thinker Посмотреть сообщение
обработка бинарных деревьев чаше всего рекурсивна
Мне даже интересно стало, как вы будете обходить дерево, используя цикл
1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
13.05.2017, 12:57
sancho1996, рекурсия используется для работы с данными, у которых структура (объект)
содержит вложенный объект, структурно аналогичный самому себе или (что бывает чаще) ссылку на такой же объект.
И тогда для работы с вложенным объектом просто вызываем самого себя, но с новыми параметрами.
Подобная структура объектов удобно тем, что так можно описать потенциально бесконечную структуру данных.
Подобные структуры используются при описании списков и графов, тех же деревьев.
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
13.05.2017, 13:28
Цитата Сообщение от eXPonent Посмотреть сообщение
Подскажите нужна ли рекурсия в С++
ЕСЛИ её можно заменить for ?
В принципе, без рекурсии можно обойтись. Вот, Дональд Кнут в своей классической монографии "Искусство программирования" всячески рекурсии избегает. И для задач, в которых рекурсия просто напрашивается (не вычисление факториала! ) просто моделирует стеки. В итоге его алгоритмы выглядят на порядок более громоздкими, чем могли бы быть.

Добавлено через 3 минуты
Ну, а класс задач, в которых применение рекурсии естественно, кратко описал уважаемый _liv_.
А вообще-то и без циклов for можно обойтись, и вообще без циклов. Есть же goto
2
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
13.05.2017, 14:14

Не по теме:

согласен в ассемблере без джампа никак) он по всюду



А об рекурсии я имел ввиду, что она часто память жрут сильно много, даже грамотно написанные, а особенно если случайно допустил ошибку и она сожрет её всю
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
13.05.2017, 14:20
Цитата Сообщение от eXPonent Посмотреть сообщение
грамотно написанные
Грамотно написанные - грамотно используют память.
Кривые руки любую программу введут в ступор...
Любой метод - неуниверсален. К каждому типу задач необходимо пременять свой подход.
Рекурсия - не панацея, но порой без нее не обойтись, точнее, без нее намного сложнее...
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
13.05.2017, 14:20
Цитата Сообщение от eXPonent Посмотреть сообщение
а особенно если случайно допустил ошибку и она сожрет её всю
Если допустил ошибку, то и без рекурсии будешь сожран.
0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
13.05.2017, 14:22
Цитата Сообщение от _liv_ Посмотреть сообщение
потенциально бесконечную структуру данных.
можно примеры?
как все данные должны быть конечными, иначе их вес будет бесконечным

Добавлено через 15 секунд
Цитата Сообщение от _liv_ Посмотреть сообщение
потенциально бесконечную структуру данных.
можно примеры?
как все данные должны быть конечными, иначе их вес будет бесконечным
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
13.05.2017, 14:23
Цитата Сообщение от eXPonent Посмотреть сообщение
А об рекурсии я имел ввиду, что она часто память жрут сильно много, даже грамотно написанные, а особенно если случайно допустил ошибку и она сожрет её всю
В C++ компиляторы уже давно умеют в оптимизацию хвостовой рекурсии.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
13.05.2017, 14:27
Цитата Сообщение от eXPonent Посмотреть сообщение
как все данные должны быть конечными, иначе их вес будет бесконечным
Я ж сказал "потенциально бесконечную", т.е. конечную, но сколько позволяет архитектура
0
Одессит
 Аватар для kylroma
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
13.05.2017, 16:58
Цитата Сообщение от eXPonent Посмотреть сообщение
Подскажите нужна ли рекурсия в С++
ЕСЛИ её можно заменить for ?
Макконелл советует обходиться без рекурсии, если это возможно. Код становится более понятным и меньше возможностей сделать ошибку, например переполнение стека.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.05.2017, 16:58
Помогаю со студенческими работами здесь

Явная специализация, зачем она нужна?(Шаблоны функций)
Какой смысл в явной специализации, когда есть перегрузка? если можно, и примерчик) я себе уже в голову вбил, и тут надо чем-то тяжелым...

ООП: Зачем нужна таблица виртуальных методов? Она замедляет работу программы
Разве нельзя определить, метод какого класса вызывать во время компиляции?

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять?
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь...

Кто-нибудь может подробно объяснить, что такое allocators, зачем это и что с ними делать? Нигде не нашёл инфы
Заранее спасибо.

Что такое hash-таблицы, и зачем они нужны?
Обьясните пожалуста по простому что такое хеш таблици и зачем они надо... пытался разобратся с ними сам, но ничего не получилось....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru