Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите написать рекурсивную функцию 
V
    Опции темы
qw1mb0
Дата 1.4.2012, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Добрый день форумчане.
Появилась необходимость в написании рекурсивной функции, но если честно не представляю как это сделать:
Вот задание:
user posted image
При каждом вызове функции она должна возращать следующее приближение к sin x.
Накидал примерно такое: 
Код

int rec(int next){
x = pow(x,next)/factorial(next) - rec(next+2) + rec(next + 4);
}

Но как выйти из рекурсии не представляю... Кто может помогите пожалуйста
PM MAIL ICQ Skype   Вверх
alexvs11
Дата 1.4.2012, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



Код

#include <math.h>

#define EPS (0.000001)

//
//  f(x) =  x - x^3/3! + ... + [(-1)^n * x^(2n+1)/(2n+1)! = prev] - x^2 * prev / ((2n+1)*2n) 
//

double rec(int n, double x, double prev, double res)
{

   double temp = - x * x * prev / (2.0 * n * (2 * n + 1));

   printf ("%d, %f, %f, %f, [%f]\n", n, x, prev, res, temp);

   res += temp;

   if (fabs(temp) < EPS)
   {
       return res;
   }

   return rec (n+1, x, temp, res);
}

double f (double x)
{
   return rec (1, x, x, x);
}

int main()
{
   printf ("f(-3) = %f\n", f (-3)); 
   return 0;
}


както так

Это сообщение отредактировал(а) alexvs11 - 2.4.2012, 00:08
PM MAIL   Вверх
qw1mb0
Дата 2.4.2012, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Честно говоря с математикой я совсем не дружу да и с программированием не очень smile 
Но мне казалось, что при каждой итерации функция должна стремится к sin x, не так ли? 
Может это не понимание из-за непонимания кода, но код вроде как рабочий  и почему надо отрицательное число передавать?
PM MAIL ICQ Skype   Вверх
alexvs11
Дата 2.4.2012, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



qw1mb0, я подправил, теперь стремится smile 
не сразу вспомнил, что это за ряд
а синусу без разницы какое число передавать
PM MAIL   Вверх
qw1mb0
Дата 2.4.2012, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



alexvs11
Код

double temp = - x * x * prev / (2.0 * n * (2 * n + 1));

Можно ведь вместо (2.0*n*(2*n+1)) использовать рекурсивную функцию факториала с аргументом n ?

Код

int factorial(int x){
  return !x ? 1 : x *factorial(x-1);
}


Добавлено через 3 минуты и 3 секунды
Хм. Попробывал, понял что, что-то не то.
Не могли бы вы обьяснить строку:
Код

double temp = - x * x * prev / (2.0 * n * (2 * n + 1));

PM MAIL ICQ Skype   Вверх
alexvs11
Дата 2.4.2012, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



qw1mb0, вычислять каждый раз факториал не имеет смысла
поясню
[n = 1]  x / 1!, обозначим его prev0
[n = 2]  (-1) * x^3 / 3! = -1 * x^2 / (2*3) * prev0 = - 1 * x^2 * (2*n * (2*n - 1)), обозначим как prev1
[n = 3] x^5 / 5! = - x^2 / (4 * 5) * prev1 = - x^2 / (2*n * (2*n - 1)) * prev1

PM MAIL   Вверх
qw1mb0
Дата 2.4.2012, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



А еще возник вопрос, это наверное более математический
почему при выводы функции с аргуменатми
f(1) = 0.841471
f(2) = 0.909297
f(3) = 0.141120
f(4) = -0.756802

Или же про, что можно почитать, что бы данные вычисления были более ясны?
PM MAIL ICQ Skype   Вверх
alexvs11
Дата 2.4.2012, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



qw1mb0, что именно неясно?
PM MAIL   Вверх
qw1mb0
Дата 2.4.2012, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Почему такие значения smile
PM MAIL ICQ Skype   Вверх
alexvs11
Дата 2.4.2012, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



это значение синуса в радианной мере
f(0) = 0, f(3.14) примерно равна нулю, f(1.57) около 1цы

сам по себе метод вычисления - это разложение в ряд тейлора синуса (в данном случае в ряд маклорена)
PM MAIL   Вверх
qw1mb0
Дата 2.4.2012, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Спасибо большое, теперь стало на порядок яснее. Примного благодарен, еще почитаю о рядах.
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0933 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.