Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Помогите написать рекурсивную функцию


Автор: qw1mb0 1.4.2012, 23:39
Добрый день форумчане.
Появилась необходимость в написании рекурсивной функции, но если честно не представляю как это сделать:
Вот задание:
http://s2.ipicture.ru/
При каждом вызове функции она должна возращать следующее приближение к sin x.
Накидал примерно такое: 
Код

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

Но как выйти из рекурсии не представляю... Кто может помогите пожалуйста

Автор: alexvs11 1.4.2012, 23:58
Код

#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;
}


както так

Автор: qw1mb0 2.4.2012, 00:05
Честно говоря с математикой я совсем не дружу да и с программированием не очень smile 
Но мне казалось, что при каждой итерации функция должна стремится к sin x, не так ли? 
Может это не понимание из-за непонимания кода, но код вроде как рабочий  и почему надо отрицательное число передавать?

Автор: alexvs11 2.4.2012, 00:09
qw1mb0, я подправил, теперь стремится smile 
не сразу вспомнил, что это за ряд
а синусу без разницы какое число передавать

Автор: qw1mb0 2.4.2012, 00:12
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));

Автор: alexvs11 2.4.2012, 00:21
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

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

Или же про, что можно почитать, что бы данные вычисления были более ясны?

Автор: alexvs11 2.4.2012, 00:31
qw1mb0, что именно неясно?

Автор: qw1mb0 2.4.2012, 00:33
Почему такие значения smile

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

сам по себе метод вычисления - это разложение в ряд тейлора синуса (в данном случае в ряд маклорена)

Автор: qw1mb0 2.4.2012, 00:39
Спасибо большое, теперь стало на порядок яснее. Примного благодарен, еще почитаю о рядах.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)