Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

_Ayl_
Статус: Студент
Рейтинг: 1366
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 954
∙ повысить рейтинг »
Micren
Статус: Бакалавр
Рейтинг: 924
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Номер выпуска:1404
Дата выхода:13.10.2009, 22:30
Администратор рассылки:Dr_Andrew, Модератор
Подписчиков / экспертов:642 / 167
Вопросов / ответов:1 / 3
IRC-канал по теме:#C

Вопрос № 173066: Добрый вечер уважаемые эксперты. Помогите с задачей.Она то простенькая, но у меня с математикой не очень. Условие в графическом формате по ссылке http://s43.radikal.ru/i102/0910/73/e07dc34c91ef.jpg. *Примечание: При определении суммы членов ряд...



Вопрос № 173066:

Добрый вечер уважаемые эксперты. Помогите с задачей.Она то простенькая, но у меня с математикой не очень. Условие в графическом формате по ссылке http://s43.radikal.ru/i102/0910/73/e07dc34c91ef.jpg.
*Примечание:
При определении суммы членов ряда следует использовать рекуррентную
формулу для получения следующего члена ряда.
Пожалуйста помогите решить ее, или хоты бы вывести реккурентную формулу. Заранее благодарен.

Отправлен: 08.10.2009, 18:13
Вопрос задал: Dimon4ik, 5-й класс
Всего ответов: 3
Страница вопроса »


Отвечает leonid59, Студент :
Здравствуйте, Dimon4ik.
a[n]=n!/(2n)!.
Для n=0, a[n]=1, т.к. 0!=1.
Для n>=1 a[n] / a[n-1] = (n!/(2n)!):((n-1)!/(2(n-1))! = n/(2n*(2n-1))=1/2(2n-1)=1/(4n-2). Так получили рекуррентную формулу.
...
if (n==0) a=1;
else a=a(n-1)/(4*n-2);
...

Ответ отправил: leonid59, Студент
Ответ отправлен: 08.10.2009, 20:36

Оценка ответа: 5
Комментарий к оценке:
Спасибо за формулу.

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255174 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Micren, Бакалавр :
    Здравствуйте, Dimon4ik.
    Программа. MS VS 2008.

    Код:

    #include <iostream>
    #include <iomanip>
    #include <cmath>

    const double eps=1.0e-4;

    using namespace std;

    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 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Максим Юрьевич, 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). При каждой попытке нового вычисления проверять, не вычисляли ли мы это значение ранее. Если уже вычисляли, то брать значение из этого массива, если нет, тогда, конечно, посчитаем.
    Код - в приложении.

    Приложение:

    Ответ отправил: Максим Юрьевич, 6-й класс
    Ответ отправлен: 09.10.2009, 16:00

    Оценка ответа: 5

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255207 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.9 от 25.09.2009

    В избранное