Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для trembling
4 / 4 / 0
Регистрация: 28.03.2015
Сообщений: 82

Рекурсивный метод. Принцип работа

29.03.2015, 20:01. Показов 1483. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Просмотрел почти все темы связанные с рекурсивными методами, ответа интересующего меня не нашел. Кто-то может подсказать, как образом рекурсивный метод действует как цикл? Как так получается, что он как вайл будет продолжать работать пока не получи желаемый результат. Не могу понять рекурсивные методы, так как не могу понять принцип работы. И вроде разбираю чужой код и вот вот понимаю. но нет. не то. И все заново. И так уже не первый день.
Скажите, как так происходит, что обычный метод без цикла, работает как цикл?
Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.03.2015, 20:01
Ответы с готовыми решениями:

Рекурсивный и не рекурсивный метод написания кода
Объясните пожалуйста, чем отличаются два таких метода. Желательно с примерами.

Рекурсивный метод
Помогите доделать пожалуйста #include <iostream> #include<math.h> #include<conio.h> using namespace...

Рекурсивный метод
Не могу понять, как сделать Получается для 1 и 2 function func(n:integer):real; begin If n=1 then func:=1 else ...

8
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,885
29.03.2015, 20:28
Стандартный цикл:
C#
1
2
3
4
for(int i = 0; i < 10; i++)
{
    Console.WriteLine(i);
}
Или то же самое:
C#
1
2
3
4
5
6
7
8
int i = 0;
for(;;)
{
    if(i >= 10) break;
        
    Console.WriteLine(i);
    i = i + 1;
}
Или с помощью рекурсии:
C#
1
2
3
4
5
6
void Loop(int i)
{
    if(i >= 10) return;
    Console.WriteLine(i);
    Loop(i + 1);
}
0
 Аватар для trembling
4 / 4 / 0
Регистрация: 28.03.2015
Сообщений: 82
29.03.2015, 20:49  [ТС]
Извини, но я ничего не понял с того, что написано))
даже еще больше запутался.

Добавлено через 1 минуту
я знаю как выглядят циклы и знаю, как как пишутся рекурсивные методы. суть вопроса была в том, что я не понимаю принцип работы, а не принцип синтаксиса и записи.

Добавлено через 13 минут
кто может объяснить этот синтаксис? все в строку не много путает. можете просто расставить скобки ?? а то не понятно где иф заканчивается, есть ли там элс или это какие-то регекс..

C#
1
2
3
4
5
6
7
8
9
static int factorial(int i)
        {
            int result;
 
            if (i == 1)
                return 1;
            result = factorial(i - 1) * i;
            return result;
        }
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
29.03.2015, 20:51
trembling, добавьте как можно больше строк вывода сообщений и тогда вы сможете понять последовательность вызовов,а следовательно ваш алгоритм и принцип рекурсии.
1
 Аватар для trembling
4 / 4 / 0
Регистрация: 28.03.2015
Сообщений: 82
29.03.2015, 21:08  [ТС]
Цитата Сообщение от S_el Посмотреть сообщение
trembling, добавьте как можно больше строк вывода сообщений и тогда вы сможете понять последовательность вызовов,а следовательно ваш алгоритм и принцип рекурсии.
мне очень туго идет эта тема, не будет для тебя утруждением если я попрошу тебя помочь мне с этим кодом ? ^_^ я буду очень благодарен. просто я не доганяю, где именно тыкать выводы.
в принципе я в общих чертах понимаю, но надо теперь конкретно по кусочкам разобрать это.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
29.03.2015, 21:42
Лучший ответ Сообщение было отмечено trembling как решение

Решение

Цитата Сообщение от trembling Посмотреть сообщение
в принципе я в общих чертах понимаю, но надо теперь конкретно по кусочкам разобрать это.
Лучше всего рекурсивный принцип изучать вместе с каким-нибудь ФЯП.Там почти все на рекурсии основано.
Немного переписал ваш код,теперь должно стать понятнее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
 
public class Test
{
    public static void Main()
    {
        Console.WriteLine(factorial(10));
    }
    static int factorial(int i)
        {
           Console.WriteLine("Функция вызвана с аргументом "+i);
            return (i==1) ? 1 : i*factorial(i-1);
        }
}
Добавлено через 8 минут
Для большего понимания немного перепишу функцию для вычисления факториала(его так никто не считает,но для демонстрационных целей пойдет).
Функция на Erlang:
Python
1
2
3
Fact3 = fun F(0,Res)-> io:format("Функция дошла до 0. Рекурсивный вызов закончился~n"),Res;
F(N,Res)->io:format("Вызвана функция с аргументом ~p~n",[N]),F(N-1,Res*N), 
io:format("Выход из функции с аргументом ~p~n",[N])end(5,1).
Здесь второй аргумент рекурсивно накапливает в себе значение факториала.
В результате имеем такой вывод:
Code
1
2
3
4
5
6
7
8
9
10
11
12
Вызвана функция с аргументом 5
Вызвана функция с аргументом 4
Вызвана функция с аргументом 3
Вызвана функция с аргументом 2
Вызвана функция с аргументом 1
Функция дошла до 0. Рекурсивный вызов закончился
Выход из функции с аргументом 1
Выход из функции с аргументом 2
Выход из функции с аргументом 3
Выход из функции с аргументом 4
Выход из функции с аргументом 5
ok
Как видите сначала вызов идет до ветви,на которой рекурсивный вызов заканчивается,а затем раскручивается в обратную сторону.
1
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,885
29.03.2015, 22:24
Цитата Сообщение от trembling Посмотреть сообщение
Извини, но я ничего не понял с того, что написано))
даже еще больше запутался.
Советую поставить точку прерывания на первую строку кода и прогнать весь код под отладчиком.
1
 Аватар для trembling
4 / 4 / 0
Регистрация: 28.03.2015
Сообщений: 82
29.03.2015, 23:17  [ТС]
оо спасибо. вот это уже дает надежды на то, что в скором времени наконец-то разберусь с этим)
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
31.03.2015, 23:24
Да, разобраться с этим интересно. Например, представленная выше рекурсивная реализация факториала "порождает линейно-рекурсивный процесс" (С) и не может претендовать на аналог цикла ака хвостовая рекурсия. В отличие от нее, функция
C++
1
2
3
int iter_factorial (int n, int a) { return n ? iter_factorial (n-1, a*n) : a; }
.......
cout << iter_factorial (10, 1);
"порождает линейно-итеративный процесс" (С) и является аналогом цикла.
А вообще, SICP в помощь, стр 48 - Линейные рекурсия и итерации, и далее, если действительно интересно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.03.2015, 23:24
Помогаю со студенческими работами здесь

Рекурсивный метод
Дано натуральное число n. Разработать рекурсивный метод для вывода на экран следующей последовательности чисел: 1 2 1 3 2 1 … ...

Рекурсивный метод
помогите с решением

Рекурсивный метод
Возможно, кто-то уже решал такую задачу как подпрограмму, или еще где. А, может, кто-то сходу видит, как это сделать. Динамическим...

Рекурсивный метод из нерекурсивного
Добрый день! Имеется задача о рюкзаке в упрощенном виде: необходимо найти предметы, с помощью которых нужно заполнить рюкзак вместимостью...

Рекурсивный и итеративный метод
помогите пожалуйста написать программу для итеративного способа вычисления. нужно вычислить элементы последовательности a(n) = a(n...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru