Форум программистов, компьютерный форум, киберфорум
Наши страницы
Алгоритмы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
trembling
4 / 4 / 0
Регистрация: 28.03.2015
Сообщений: 82
1

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

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

Просмотрел почти все темы связанные с рекурсивными методами, ответа интересующего меня не нашел. Кто-то может подсказать, как образом рекурсивный метод действует как цикл? Как так получается, что он как вайл будет продолжать работать пока не получи желаемый результат. Не могу понять рекурсивные методы, так как не могу понять принцип работы. И вроде разбираю чужой код и вот вот понимаю. но нет. не то. И все заново. И так уже не первый день.
Скажите, как так происходит, что обычный метод без цикла, работает как цикл?
Спасибо.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2015, 20:01
Ответы с готовыми решениями:

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

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

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

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

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

8
Shamil1
Модератор
2440 / 1651 / 368
Регистрация: 26.03.2015
Сообщений: 6,036
29.03.2015, 20:28 2
Стандартный цикл:
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  [ТС] 3
Извини, но я ничего не понял с того, что написано))
даже еще больше запутался.

Добавлено через 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
S_el
2314 / 1741 / 369
Регистрация: 15.12.2013
Сообщений: 7,054
29.03.2015, 20:51 4
trembling, добавьте как можно больше строк вывода сообщений и тогда вы сможете понять последовательность вызовов,а следовательно ваш алгоритм и принцип рекурсии.
1
29.03.2015, 20:51
trembling
4 / 4 / 0
Регистрация: 28.03.2015
Сообщений: 82
29.03.2015, 21:08  [ТС] 5
Цитата Сообщение от S_el Посмотреть сообщение
trembling, добавьте как можно больше строк вывода сообщений и тогда вы сможете понять последовательность вызовов,а следовательно ваш алгоритм и принцип рекурсии.
мне очень туго идет эта тема, не будет для тебя утруждением если я попрошу тебя помочь мне с этим кодом ? ^_^ я буду очень благодарен. просто я не доганяю, где именно тыкать выводы.
в принципе я в общих чертах понимаю, но надо теперь конкретно по кусочкам разобрать это.
0
S_el
2314 / 1741 / 369
Регистрация: 15.12.2013
Сообщений: 7,054
29.03.2015, 21:42 6
Лучший ответ Сообщение было отмечено 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).
Здесь второй аргумент рекурсивно накапливает в себе значение факториала.
В результате имеем такой вывод:
Код
Вызвана функция с аргументом 5
Вызвана функция с аргументом 4
Вызвана функция с аргументом 3
Вызвана функция с аргументом 2
Вызвана функция с аргументом 1
Функция дошла до 0. Рекурсивный вызов закончился
Выход из функции с аргументом 1
Выход из функции с аргументом 2
Выход из функции с аргументом 3
Выход из функции с аргументом 4
Выход из функции с аргументом 5
ok
Как видите сначала вызов идет до ветви,на которой рекурсивный вызов заканчивается,а затем раскручивается в обратную сторону.
1
Shamil1
Модератор
2440 / 1651 / 368
Регистрация: 26.03.2015
Сообщений: 6,036
29.03.2015, 22:24 7
Цитата Сообщение от trembling Посмотреть сообщение
Извини, но я ничего не понял с того, что написано))
даже еще больше запутался.
Советую поставить точку прерывания на первую строку кода и прогнать весь код под отладчиком.
1
trembling
4 / 4 / 0
Регистрация: 28.03.2015
Сообщений: 82
29.03.2015, 23:17  [ТС] 8
оо спасибо. вот это уже дает надежды на то, что в скором времени наконец-то разберусь с этим)
0
_Ivana
4222 / 1935 / 246
Регистрация: 01.03.2013
Сообщений: 5,243
Записей в блоге: 22
31.03.2015, 23:24 9
Да, разобраться с этим интересно. Например, представленная выше рекурсивная реализация факториала "порождает линейно-рекурсивный процесс" (С) и не может претендовать на аналог цикла ака хвостовая рекурсия. В отличие от нее, функция
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
31.03.2015, 23:24
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2015, 23:24

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.