Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Ёрик
46 / 46 / 2
Регистрация: 07.01.2009
Сообщений: 298
#1

Ряды. Рекурсия - C++

08.08.2009, 08:50. Просмотров 2591. Ответов 13
Метки нет (Все метки)

В общем,у меня задача написать рекурсивно вычисление выражения exp(0.56*x+ln(x^2))
с помощью рядов. Нужно получить число просуммированных членов ряда,обеспечивающих вычисление исходной функции с задаваемой абсолютной или
относительной степенями точности. Формула у нас такая: http://myphoto.nnov.ru/thumb/1eecf3b...dc0ca747c1.jpg. А рекурсия вот откуда берется: вычислить обязательно нужно через реккурентное вычисление последущего члена через предыдущий.Вот соответственно выражение V_k через V_K+1:
http://myphoto.nnov.ru/thumb/a94eef8...76a0b5d70f.jpg.Но невозможно бесконечное суммирование ряда,поэтому вычисление с заданной степенью точности подразумевает критерий остановки процесса суммирования http://myphoto.nnov.ru/thumb/7d4da9f...9f362c4133.jpg соответственно для достижений заданных значения абсолютной и относительной точностей вычисления суммы ряда S_k на k-ом шаге.
Вот такое задание. Мне обязательно нужно сделать через рекурсию! Не могу определить терминальное условие выхода из рекурсивной функции,т.к. у нас еще здесь суммирование.Точнее получается,терминальное условие http://myphoto.nnov.ru/thumb/7d4da9f...9f362c4133.jpg.Но как тогда построить тело функции? Тут приходится проверять результат выполненной функции. Кстати, точность Q и переменную х мы вводим сами. Q может быть равно ,напр., 0.000001.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2009, 08:50     Ряды. Рекурсия
Посмотрите здесь:

ряды в С++ C++
C++ Ряды
ряды C++
C++ ряды
C++ Ряды
Ряды в С++ C++
C++ Ряды Тейлора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт С++
7153 / 3293 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
08.08.2009, 20:34     Ряды. Рекурсия #2
Запости картинки прямо в форум - в нем есть такая функция.
Ёрик
46 / 46 / 2
Регистрация: 07.01.2009
Сообщений: 298
08.08.2009, 20:52  [ТС]     Ряды. Рекурсия #3
У меня есть код,написанный в цикле,но мне по голове дали за него и сказали,что можно написать рекурсией:
Код:
C++
1
2
3
4
5
6
7
8
9
10
            k = 1;
            y3 = 1.0;
            v = 1.0;
 
            while( fabs(v/y3) >= eps)
            {
                v *=  (temp)/k;
                y3 += v;
                k++;
            }
Соответственно все переменные объявлены как double."temp" - это степень(я потом сам могу любую написать),"y3" - значение функции, "к" - шаг, "eps" - степень точности.
Все картинки загружал поочереди,как они идут в тексте.Затем последние 2 картинки повторяются,просто они обе не загружаются,и я выкладываю только одну.
p.s. Код правильный,только мне нужно переписать рекурсией(см выше)
Изображения
   
odip
Эксперт С++
7153 / 3293 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
08.08.2009, 20:57     Ряды. Рекурсия #4
Все картинки загружал поочереди
Вроде ты можешь как автор отредактировать исходное сообщение

можно написать рекурсией
Это идиотизм. Если ты решил задачу без рекурсии - это нормально.
Рекурсия совершенно не лучше чем без нее.
Или препод хочет чтобы ты решил задачу именно с использованием рекурсии ?
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
08.08.2009, 21:28     Ряды. Рекурсия #5
Как мне в универе обьяснял очень хороший препод - рекурсией можно решить любую задачу. Если задачу невозможно решить рекурсией - то эта задача нерешаемая. Но рекурсия - это всего лишь доказательство того, что задача имеет решение. Использование рекурсии оправдано всего в трех задачах(к сожалению я не помню в каких). Но я почему-то более чем уверен, что эта задача не входит в число тех трех
Ёрик
46 / 46 / 2
Регистрация: 07.01.2009
Сообщений: 298
09.08.2009, 10:53  [ТС]     Ряды. Рекурсия #6
Цитата Сообщение от odip Посмотреть сообщение
Вроде ты можешь как автор отредактировать исходное сообщение
Можно отредактировать,если сообщение создано не более 10 минут назад,а у меня уже полдня прошло.
Цитата Сообщение от odip Посмотреть сообщение
Или препод хочет чтобы ты решил задачу именно с использованием рекурсии?
Именно так
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
09.08.2009, 11:08     Ряды. Рекурсия #7
Цитата Сообщение от Ёрик Посмотреть сообщение
Код правильный,только мне нужно переписать рекурсией(см выше)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void fcn(double &v, double &y3, double eps, double power, int &k) {
  if (fabs(v / y3) < eps) return;
 
  v *= power / k;
  y3 += v;
  k++;
  
  fcn(v, y3, eps, power, k);
}
 
int main() {
  int k = 1;
  double y3 = 1.0;
  double v = 1.0;
  double eps = 0.000001;
  double power = 3;
 
  fcn(v, y3, eps, power, k);
}
odip
Эксперт С++
7153 / 3293 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
09.08.2009, 11:40     Ряды. Рекурсия #8
Как мне в универе обьяснял очень хороший препод
А тебе препод не объяснял, что любую задачу решенную с помощью рекурсии можно решить и без рекурсии ?
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
09.08.2009, 11:43     Ряды. Рекурсия #9
Цитата Сообщение от odip Посмотреть сообщение
что любую задачу решенную с помощью рекурсии можно решить и без рекурсии ?
можно. но некоторые задачи элегантно(легче/быстрей/понятней) решаются именно с помощью рекурсивной реализации.
Ёрик
46 / 46 / 2
Регистрация: 07.01.2009
Сообщений: 298
09.08.2009, 12:11  [ТС]     Ряды. Рекурсия #10
zim22,спасибо,примерно так и предполагал,только не нравилось мне большое количество параметров,поэтому думал,что,возможно, как-н. без них можно обойтись.А вообще,как выглядит симпатичнее данный код?
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
09.08.2009, 12:14     Ряды. Рекурсия #11
odip, читай дальше . Там написано, что решение с помощью рекурсии оправдано только в трех задачах
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
09.08.2009, 12:26     Ряды. Рекурсия #12
Цитата Сообщение от M128K145 Посмотреть сообщение
Там написано, что решение с помощью рекурсии оправдано только в трех задачах
мало ли что там написано. рекурсию нужно применять тогда, когда она уместна. а не в "3 задачах".
***
Цитата Сообщение от Ёрик Посмотреть сообщение
не нравилось мне большое количество параметров,поэтому думал,что,возможно, как-н. без них можно обойтись
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace {
  int k = 1;
  double y3 = 1.0;
  double v = 1.0;
  double eps = 0.000001;
  double power = 3;
}
 
void do_some_work() {
  v *= power / k;
  y3 += v;
  k++;
}
void fcn() {
  if (fabs(v / y3) < eps) return;
 
  do_some_work();  
  fcn();
}
 
int main() {
  fcn();
}
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
09.08.2009, 12:30     Ряды. Рекурсия #13
zim22, прочитай пятый пост
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2009, 14:43     Ряды. Рекурсия
Еще ссылки по теме:

C++ числовые ряды в С++
ряды C++
Ряды C++
Ряды C++
Ряды Тейлора C++

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

Или воспользуйтесь поиском по форуму:
Ёрик
46 / 46 / 2
Регистрация: 07.01.2009
Сообщений: 298
09.08.2009, 14:43  [ТС]     Ряды. Рекурсия #14
спасибо,все равно придется оставить предыдущий вариант,т.к. у меня возращаемое значение есть,причем у меня также есть шаг,в котором я задаю шаг,предельное значение, ... . Задачка чуть посложней.Но все равно спасибо за интересный вариант.
Yandex
Объявления
09.08.2009, 14:43     Ряды. Рекурсия
Ответ Создать тему
Опции темы

Текущее время: 20:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru