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

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

02.07.2013, 19:52. Показов 17105. Ответов 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
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
13.05.2017, 17:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kylroma Посмотреть сообщение
Код становится более понятным
спорное утверждение...
Обход дерева при помощи рекурсии выглядит элегантно и понятно, в отличие от цикла.
Для каждой задачи свои методы. А ошибки... Они в прямой зависимости от кривизны рук...
0
Одессит
 Аватар для kylroma
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
13.05.2017, 17:19
_liv_, ну он не скрывает, что его советы спорные и могут противоречить друг-другу.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
13.05.2017, 17:29
Цитата Сообщение от kylroma Посмотреть сообщение
его советы спорные и могут противоречить друг-другу
Ну и зачем тогда предлагать здесь спорные советы?
Рекурсия - прекрасный метод для решения соответствующих задач. Чтобы не было переполнения стека, необходимо четко представлять себе возможную глубину рекурсии и иметь прямые руки...
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.05.2017, 18:01
Цитата Сообщение от sancho1996 Посмотреть сообщение
Что такое рекурсия?
вызов программы самой себя
Цитата Сообщение от sancho1996 Посмотреть сообщение
Зачем она нужна?
прост. И вообще, зачем нужно искать смысол в вещах из окружающей действительности, некоторые из них просто существуют и все.
0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
13.05.2017, 18:15
Цитата Сообщение от S_el Посмотреть сообщение
В C++ компиляторы уже давно умеют в оптимизацию хвостовой рекурсии.
примеры можно, а то я не понимаю о чем вы говорите.

Добавлено через 4 минуты
Цитата Сообщение от _liv_ Посмотреть сообщение
Я ж сказал "потенциально бесконечную", т.е. конечную, но сколько позволяет архитектура
Цитата Сообщение от eXPonent Посмотреть сообщение
можно примеры?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
13.05.2017, 18:28
Цитата Сообщение от eXPonent Посмотреть сообщение
можно примеры?
Навскидку, например, организовать индексы по некой огромной базе данных в виде двоичного дерева. Хранить в файле. А работать с ним, отображая его в память. Поиск по такому дереву будет практически мгновенным. Размер ограничен только размером диска.
Удобно тем, что коррекция происходит быстро и практически не зависит от объема информации
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
13.05.2017, 18:55

Не по теме:

Цитата Сообщение от kylroma Посмотреть сообщение
Макконелл советует обходиться без рекурсии,
Как говорил Веничка Ерофеев - "Плюньте ему в его соленые рыжики!:D



Добавлено через 17 минут
Итак.
1.Без рекурсии обойтись можно. Есть циклы и, в конце концов, ГОУТО
2.Для реализации существенно рекурсивных алгоритмов нужен стек. Его можно и самостоятельно смоделировать. Но зачем, если язык уже предлагает готовое?
Использование этого готового стека упрощает ваш код, но вы теряете прямой контроль за его поведением. За переполнением, например. Контроль косвенный возможен, но его применение весьма непросто, средо/аппаратно зависимо и может усложнить код настолько, что моделируемый стек покажется конфеткой.
3. Как говаривал К.Прутков, "Даже не пытайтесь объять необъятное". Ваш компьютер (вместе со всеми сетями мира) - всего лишь конечный автомат. И совершенно нелепо решать на нем истинно бесконечные задачи. Ограничения есть всегда.
В качестве упражнения попробуйте написать программу, выводящую все десятичные знаки корня из двух.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
13.05.2017, 19:02
Цитата Сообщение от eXPonent Посмотреть сообщение
примеры можно, а то я не понимаю о чем вы говорите.
Хвостовая рекурсия - рекурсивный вызов строго в конце функции. Точнее, вызов сразу перед return. Во многих случаях такой вызов можно заменить тупым goto в начало функции и не транжирить стек. Хотя, можно придумать особо изощренный пример в котором фокус не сработает.
Цитата Сообщение от Байт Посмотреть сообщение
2.Для реализации существенно рекурсивных алгоритмов нужен стек. Его можно и самостоятельно смоделировать. Но зачем, если язык уже предлагает готовое?
Штатный стек не резиновый, на рекурсивном алгоритме заливки изображения 4096x4096 сломаться может.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
13.05.2017, 19:10
Цитата Сообщение от Renji Посмотреть сообщение
Штатный стек <...> сломаться может
Так для стека можно дополнительную память запросить.
И вообще, о чем мы тут говорим? Пред написанием программы надо сначала все продумать. И принять тот метод решения, который приемлем. Нет универсальных методов. Все имеет свои ограничения.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
13.05.2017, 19:36
Цитата Сообщение от Renji Посмотреть сообщение
Штатный стек не резиновый,
У меня такое ощущение, что ниже процитированных слов вы просто не посмотрели.
0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
14.05.2017, 12:47
Цитата Сообщение от Renji Посмотреть сообщение
Хвостовая рекурсия - рекурсивный вызов строго в конце функции. Точнее, вызов сразу перед return. Во многих случаях такой вызов можно заменить тупым goto в начало функции и не транжирить стек. Хотя, можно придумать особо изощренный пример в котором фокус не сработает.
никогда об этом бы не подумал
но ведь как раз в том случае можно все написать через for внутри функции
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
14.05.2017, 15:59
В случае хвостовой рекурсии - да. В случае хвостового вызова - нет.
0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
14.05.2017, 18:00
Цитата Сообщение от _Ivana Посмотреть сообщение
В случае хвостовой рекурсии - да. В случае хвостового вызова - нет.
а можно примеры, вашего варианта, а то трудно ориентироваться в этих понятиях
или это уже зарезервированные вещи в языке С++ ?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.05.2017, 18:10
Цитата Сообщение от eXPonent Посмотреть сообщение
а можно примеры, вашего варианта, а то трудно ориентироваться в этих понятиях
Там везде суть одна. Наивная реализация:
Вызвать что-то там.
Выкинуть из стека данные текущей функции.
return.

Оптимизация 1:
Выкинуть из стека данные текущей функции (их все равно больше никто не использует, ведь дальше return).
Вызвать что-то там.
return.

Оптимизация 2:
Выкинуть из стека данные текущей функции (их все равно больше никто не использует, ведь дальше return).
goto что-то там (из-за особенностей аппаратной реализации вызова функций, эквивалентно паре call/ret идущей строго друг за другом).
2
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
14.05.2017, 18:10
C++
1
2
3
bool isOdd(int);
bool isEven(int n) { return n==0 ? true : isOdd(n-1); }
bool isOdd(int n) { return n==0 ? false : isEven(n-1); }
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.05.2017, 19:14
sancho1996,
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; Рекурсивная процедура вычисления факториала
; вход: CX - число без знака
; выход: AX - результат
factorial:
    push bp                 ;Сохранение BP
    mov bp,sp               ;BP=SP
    mov ax,[bp+4]           ;AX=параметр
    test ax,ax              ;Проверка AX
    jz f_ret1               ;Если 0, вернуть 1
    dec ax                  ;Декремент AX
    push ax                 ;Помещение параметра в стек
    call factorial          ;Вызов процедуры для предыдущего числа
    mul word[bp+4]          ;Умножение результата на параметр процедуры
    jmp f_ret               ;Переход к возврату из процедуры
f_ret1:
    inc ax
f_ret:
    pop bp                  ;Восстановление BP
    ret 2                   ;Возврат из процедуры
в этом коде рекурсия более наглядна.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
14.05.2017, 19:15
Цитата Сообщение от Байт Посмотреть сообщение
в которых рекурсия просто напрашивается (не вычисление факториала!
как я уже говорил, зависит от определения факториала
если так, факториал есть произведение всех натуральных чисел от 1 до n, это цикл
а если, факториал есть произведение n на факториал n-1, факториал 1 равен 1, то это рекурсия
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
14.05.2017, 19:22
Цитата Сообщение от ValeryS Посмотреть сообщение
зависит от определения факториала
Так для того нам и дана верхняя оконечность, чтобы понять, что эти определения равносильны, и применить наиболее простую и естественную реализацию
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
14.05.2017, 19:26
Байт, в случае факториала и фибоначчей это тривиально. Но могу накидать других случаев, когда итеративная реализация неочевидна, а рекурсивная - более чем.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
14.05.2017, 19:31
Цитата Сообщение от _Ivana Посмотреть сообщение
Но могу накидать других случаев,
Не надо! Не кидай! Побереги бисер!
Я и так тебе верю!

Добавлено через 53 секунды
ЗЫ. Смотри в этой теме мой пост про Кнута.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.05.2017, 19:31

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
сукцессия 6. Питон реализация энилоджиковской модели, картинка про Центральную часть будущей модели
anaschu 26.06.2026
Етить. ИИ мне на основе моего старого файла R создал вот эту вот хмерь на пайтоне. Это уже новая модель, модель сукцессии грибной. потоки фосфора, азота. Углерода. 5 видов организмов. Я даже. . .
Как замкнутый ядерный цикл решит проблему недостатки фосфора? Био миграция фосфора со дна океана
anaschu 26.06.2026
Биологический лифт: Концепция подъема фосфора со дна океана с помощью ЗЯТЦ Предлагаю на обсуждение альтернативу тяжелому промышленному бурению океанического дна. Вместо сложной инженерии мы можем. . .
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru