Вопрос № 173066: Добрый вечер уважаемые эксперты. Помогите с задачей.Она то простенькая, но у меня с математикой не очень. Условие в графическом формате по ссылке http://s43.radikal.ru/i102/0910/73/e07dc34c91ef.jpg. *Примечание: При определении суммы членов ряд...
Вопрос № 173066:
Добрый вечер уважаемые эксперты. Помогите с задачей.Она то простенькая, но у меня с математикой не очень. Условие в графическом формате по ссылке http://s43.radikal.ru/i102/0910/73/e07dc34c91ef.jpg. *Примечание: При определении суммы членов ряда следует использовать рекуррентную формулу для получения следующего члена ряда. Пожалуйста помогите решить ее, или хоты бы вывести реккурентную формулу. Заранее благодарен.
int main() { setlocale(LC_ALL,"russian"); // Сумма double
sum=0.0; double curr=1.0; // Последний просуммированный член double last; // Счетчик членов unsigned long int count=0; // Знаменатель для рекуррентного вычисления следующего члена A(n+1)=A(n)/(4*n+2) unsigned long int div=2; do { sum+=last=curr; curr/=div; div+=4; ++count; }while(last>eps);// Условие выхода: последний просуммированный не больше требуемой точности cout<<"Просуммировано членов:
"<<count<<endl <<"Сумма:"<<setprecision(static_cast<streamsize>(abs(log10(eps)))+1)<<sum<<endl; system("PAUSE"); return 0; }
Ответ отправил: Micren, Бакалавр
Ответ отправлен: 08.10.2009, 21:31
Оценка ответа: 5 Комментарий к оценке: Спасибо, немного неясно для меня, как для новичка но все отлично работает!
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 255178
на номер 1151 (Россия) |
Еще номера »
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Отвечает Максим Юрьевич, 6-й класс :
Здравствуйте, Dimon4ik.
На первый взгляд, задача выглядит простенькой. float a(int n) { return(n?a(n-1)/(4*n-2):1.0); } Т. е. если n - не ноль, то вычисляем очередной член ряда a по рекурсивному алгоритму, если - ноль, то 1.0 (см. ответ leonid59). И далее, где-то в функции main: sum=0.0; for(int i=0;i<N;i++) sum+=a(i);
Однако, с точки зрения техники программирования, этот вариант решения не слишком хорош. Попробуем представить, что происходит при вычислении,
например, a(14): рекурсивно вызывается вычисление a(13), затем a(12) ... и так далее до a(0), что очевидно. Но! a(13) мы вычисляли в предыдущем шаге, в свою очередь вычисляя a(12), a(11) ... и так далее до a(0). Т. е. мы многократно вычисляем одни и те же значения, причём каждый раз выполняя рекурсивные погружения, вычисляющие одни и те же значения. При этом затраты оказываются достаточно большими не только вычислительные, но и затраты памяти, т. к. каждый вызов
функции "поедает" память для нужд стека. Избавиться от этого недостатка предлагаю следующим образом: надо завести глобальный массив, в который записывать вычисленные элементы a(i). При каждой попытке нового вычисления проверять, не вычисляли ли мы это значение ранее. Если уже вычисляли, то брать значение из этого массива, если нет, тогда, конечно, посчитаем. Код - в приложении.