Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/55: Рейтинг темы: голосов - 55, средняя оценка - 4.62
2 / 2 / 1
Регистрация: 10.05.2010
Сообщений: 72
1

Пример, подтверждающий что не любую итерацию можно заменить рекурсией

05.10.2010, 23:36. Показов 10390. Ответов 45
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как известно(по некоторым источникам ) любую рекурсию можно представить в виде цикла, но не наоборот. Так вот, надо придумать пример, который будет наглядно показывать , что итеративный вариант единственно возможный в данном случае.
Я по этому поводу пока ничего вразумительного предположить не могу ..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2010, 23:36
Ответы с готовыми решениями:

из питона можно сделать что то вроде интерпритатора на любую ос ?
со своим кодом(кодом питона), если да как это делается хотябы "направление"

Объяснить пример с рекурсией
#include<stdio.h> void gg(int a,int b) { int i=0; if(a==20) return; printf("%d\n",a);...

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

Доказать, что любую денежную сумму, большую 7 руб, можно выплатить без сдачи трешками и пятерками
в общем программа сделанная, но выдает такую ошибку: "function 'fdiv' should have a prototype"....

45
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
05.10.2010, 23:53 2
Цитата Сообщение от KBAC Посмотреть сообщение
любую рекурсию можно представить в виде цикла, но не наоборот
И наоборот тоже
0
2 / 2 / 1
Регистрация: 10.05.2010
Сообщений: 72
06.10.2010, 17:26  [ТС] 3
а я надеялся тут целую дискуссию развернуть..
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
07.10.2010, 07:46 4
Насчет что любой цикл можно представить в виде рекурсии - чего-то я не уверен
C
1
2
3
4
double s= 0.0;
for ( i= 0; i<=1000000; i++ ) {
   s+= sin( i );
}
Ну-ка сделайте мне это в виде рекурсии и чтобы ПОСЧИТАЛО !
0
2923 / 844 / 324
Регистрация: 30.04.2009
Сообщений: 2,633
07.10.2010, 08:17 5
C++
1
2
3
4
double f= 0.0;
for ( i= 1; i<=1000000; i++ ) {
   f*= i;
}
может быть я что то не догоняю, но я написал цикл, для поиска факториала, и как вы думаете он сильно отличается от вашего, но для него то точно можно написать рекурсию, и во многих учебниках есть даже примеры
C++
1
2
3
4
5
6
 double Factorial(int N)
  {
    double F;
    if (N<=1) F=1.; else F=Factorial(N-1)*N;
    return F;
  }
так что для вашего цикла будет так
C++
1
2
3
4
5
6
 double Factorial(int N)
  {
    double F;
    if (N=0) F=sin(0).; else F=sin(Factorial(N-1)) + sin(N);
    return F;
  }
0
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
07.10.2010, 11:48 6
Цитата Сообщение от odip Посмотреть сообщение
Ну-ка сделайте мне это в виде рекурсии и чтобы ПОСЧИТАЛО !
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void f(ref int i, ref double s)
{
    if (i > 1000000) return;
    s += Math.Sin(i);
    i++;
    f(ref i, ref s);
}
static void Main(string[] args)
{
    new Thread(() =>
    {
        double s = 0.0;
        int i = 0;
        f(ref i, ref s);
        Console.WriteLine(s);
    }, 1000000 * 4).Start();
}
Надеялся на StackOverflow?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
07.10.2010, 14:08 7
odip,
Может, ТС имел ввиду не практическую значимость, а абстрактный пример, в котором цикл действительно нельзя записать в виде рекурсии (в не зависимости от того, будет это фактически работать или нет)?
0
2 / 2 / 1
Регистрация: 10.05.2010
Сообщений: 72
07.10.2010, 15:49  [ТС] 8
я на эту тему много голову ломал, что именно мне надо ) у меня с преподом вышел разговор за экзамен в котором он мне сказал : "любую рекурсию можно заменить ... , приведите пример такой итерации". Так что мне не понятно даже в каком направлении должно быть различие .

Добавлено через 1 минуту
не различие а именно невозможность замены
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
07.10.2010, 16:39 9
Цитата Сообщение от odip Посмотреть сообщение
Насчет что любой цикл можно представить в виде рекурсии - чего-то я не уверен
C
1
2
3
4
double s= 0.0;
for ( i= 0; i<=1000000; i++ ) {
   s+= sin( i );
}
Ну-ка сделайте мне это в виде рекурсии и чтобы ПОСЧИТАЛО !
C
1
2
3
4
5
6
7
8
9
double rec(double result, size_t start, size_t end)
{
    if(start > end)
        return result;
    return rec(result + sin(start), ++start, end);
}
 
//...Вызов функции
double s = rec(0, 0, 1000000);
Между прочим, рекурсия не простая, а хвостовая

Еще вариант:
C
1
2
3
4
5
6
7
8
double rec(size_t start, size_t end)
{
    if(start > end)
        return 0;
    return sin(start) + rec(++start, end);
}
//...
double s = rec(0, 1000000);
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
07.10.2010, 17:32 10
Цитата Сообщение от Nameless One Посмотреть сообщение
рекурсия не простая, а хвостовая
Что-то никак я этой штукой пользоваться не научусь
По теме же - по-моему и циклы и рекурсия полностью взаимозаменяемы, т.к. делают по сути одно и то же, но разными путями. Другое дело - при обычной (не хвостовой) рекурсии действительно может переполнение стека случиться, так и цикл можно криво написать...
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
07.10.2010, 17:39 11
Подтверждаю: любую рекурсию можно представить в виде цикла, И НАОБОРОТ.
Преподаватель, похоже, корочки купил... или просто баран - таких полно.
0
72 / 71 / 8
Регистрация: 04.08.2010
Сообщений: 434
07.10.2010, 17:44 12
Цитата Сообщение от Patch Посмотреть сообщение
Подтверждаю: любую рекурсию можно представить в виде цикла, И НАОБОРОТ.
Преподаватель, похоже, корочки купил... или просто баран - таких полно.
Угу, был недавно совсем похожий вопрос про циклы, оказалось препод - баран
0
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
07.10.2010, 17:44 13
А цикл
C++
1
2
3
do {
   ...
} while ()
Всегда ли он представим в виде рекурсии?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
07.10.2010, 17:47 14
#pragma, почему бы и нет?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
do
{
   тело
}
while(условие);
 
//...
void rec()
{
   тело
   if(условие)
      rec();
}
0
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
07.10.2010, 17:49 15
Но ведь условие должно проверяться после исполняемого блока. Может,препод в этом контексте спрашивал?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
07.10.2010, 17:52 16
#pragma,
C
1
2
3
4
5
6
7
8
9
10
11
12
13
do
{
тело
}
while(условие);
 
//...
void rec()
{
   тело // сначала выполняется тело
   if(условие) // потом проверяется условие
      rec(); // если условие верно, выполняется еще одна итерация и т.д.
}
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
07.10.2010, 17:54 17
Ой,и правда Ну тогда сдаюсъ
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
07.10.2010, 18:11 18
Цитата Сообщение от LineStown Посмотреть сообщение
Угу, был недавно совсем похожий вопрос про циклы, оказалось препод - баран
Помню-помню
0
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
07.10.2010, 18:19 19
а в чем отличие хвостовой от обычной рекурсии?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
07.10.2010, 18:29 20
PointsEqual,
Хвостовая обычно заменяется в итоге на цикл, поскольку сама рекурсивная функция последней операцией содержит вызов самой себя без выполнения каких-либо иных операция, что аналогично переходу на следующую итерацию цикла.

Добавлено через 3 минуты
Т.е., скажем, факториал, в стандартной своей рекурсивной реализации, не заменится при компилятором на цикл, поскольку там после вызова рекурсивной функции её результат умножается на n, а цикл мы умножить ни на что не можем)))
1
07.10.2010, 18:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2010, 18:29
Помогаю со студенческими работами здесь

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

Sleep(8000) - что значит? На что можно заменить в борланд с++?
Не распознаёт Sleep(8000) . Если за комментировать пишет что f заданно но не используется. Как...

Заменить цикл рекурсией
Дана функция. float result(double x1, double e) { double x2; float temp; x2 = x1;...

Что можно заменить?
Мне нужно,чтобы была поддержка директ х11. Что можно изменить из этого?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru