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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Вычислить значение функций 
V
    Опции темы
Alexeis
Дата 28.10.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Я не бросаю, просто у меня проблемы с конектом.
Код

function Recur(x : Double; n : integer) : Double;
var
  c : double;

begin

Эта функция за один вызов считает один член.
Все члены вычисляются последовательно от первого до последнего, потому вызов производится так
Recur(x, 1) 
Код

var
  x : double;
begin
  x := 0.2;
  Repeat
    Writeln('x= ', x : 1 : 1, '  f= ', Recur(x, 1) : 2 : 4, ' n=', level);
    x := x + 0.1
  until x >= 2.001;
  readln;
end.


Для первого члена идет особая инициализация, потому он считается отдельно. Т.е. идет проверка
Код

if n = 1 //если первый член
  then
    begin
      sign := 1; //у первого члена знак +1
      fact := 3 * 2; // (2*(1)+1) = 3 - т.е считаем факториал 3-х
      n := 1;                  // гы. это осталось от прошлого решения оно нифига не делает его нужно удалить
      c := sign * exp(n * ln(x)) / ((2 * n - 1) * fact); //вычисляем очереднойчлен т.е. в данном случае первый
      sign := -sign;        //меняем знак (для вычисления следующего члена)
      fact := fact * (2 * (n + 1)) * (2 * (n + 1) + 1); //вычисляем факториал для следующего члена (5!)

      if Abs(c) > Err (если значене члена по мдулю болше погрешности то вычисляем рекурсивно второй член (а в нем может быть третий, четверый и т.д.))
      then
        Recur := c + Recur(x, n + 1)
      else
        begin
          Recur := c; //иначе говорим что все нашли с задой точностью и возвращаем значение
          level := 1; //и глубину
        end;
    end


exp(n * ln(x)) - так вычисляется значение x^n.

Код

else //это код вычисления членов 2 и выше
    begin
      c    := sign * exp(n * ln(x)) / ((2 * n - 1) * fact); //все переменные вычислены на предыдущем шаге, потому сразу вычисляем очередной член (формула та же что и для первого)
      sign := -sign; //чередум знак 
      fact := fact * (2 * (n + 1)) * (2 * (n + 1) + 1); //вычисляем факториал следующего нечетного числа

      if Abs(c) > Err
      then
        Recur := c + Recur(x, n + 1) //аналогично, если член больше погрешности, что считаем следующий и сумируем его с текущим.
      else
        begin
          Recur := c; //или просто возвращаем значение, если он меньше.
          level := n; //и глубину 
        end;
    end;
end;


если посмотреть, то в рекурсивную функцию каждый раз передается номер больший на 1 
Recur := c + Recur(x, n + 1) - так и осущиствляется инкримет членов.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Koschei
Дата 28.10.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да но товариш родной,задача с первым решением не сходитсяsmile,а там как я уже говорил ответ правильный!отсюда вывод что задача рекурсией неправильна!помогите переделать  люди,а то я скоро буду в армииsmile..
PM MAIL   Вверх
Alexeis
Дата 28.10.2006, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Как не сходится. Тот самый последний вариант сходится. Я специально проверял после исправления! Запускал оба варианта и смотрел по содержимому окон. Наверное проверялся не самый последний вариант.

Добавлено @ 20:27 
Вот ссылка на уже верный вариант http://forum.vingrad.ru/index.php?showtopi...amp;st=30&#


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Koschei
Дата 29.10.2006, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Вроде код не по порядку написан,может быть сразу напишеш готовый текст программы?
PM MAIL   Вверх
Alexeis
Дата 29.10.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Koschei @  29.10.2006,  08:38 Найти цитируемый пост)
может быть сразу напишеш готовый текст программы? 

Так я же дал ссылку на готовый код. Коментарии писал для того чтобы было понятно как работет. Что неужели так сложно из этого скомопновать то что нужно?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Koschei
Дата 29.10.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата


Так я же дал ссылку на готовый код. Коментарии писал для того чтобы было понятно как работет. Что неужели так сложно из этого скомопновать то что нужно?



Меня ссылка опять на эту страницу выкидываетsmile.Пожалуйста напиши его сюда!
Или ты имел ввиду этот верхний(всмысле вверху страницы) строчки кода?так я непонял чего  и куда писатьsmile.Можеш тогда сразу нормально написать?а то блин не выхордит у меня smile 
PM MAIL   Вверх
Alexeis
Дата 29.10.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Koschei @  29.10.2006,  17:25 Найти цитируемый пост)
Меня ссылка опять на эту страницу выкидывает

правильно это же ссылка на пост который работает уже так как надо. Пока страница грузится нужно подождать. В конце загрузки будет виден нужный пост.

Это сообщение отредактировал(а) alexeis1 - 29.10.2006, 18:26


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Koschei
Дата 29.10.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

правильно это же ссылка на пост который работает уже так как надо. Пока страница грузится нужно подождать. В конце загрузки будет виден нужный пост.

не вижу хоть убей.может куда-нибудь перезальеш?или в личку кинеш?
PM MAIL   Вверх
Alexeis
Дата 29.10.2006, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Код


program Project1;

{$N+}

const
  err = 1e-4;

var
  sign : integer;
  fact : double;
  level: Integer;

function Recur(x : Double; n : integer) : Double;
var
  c : double;

begin
  if n = 1
  then
    begin
      sign := 1;
      fact := 3 * 2;
      n := 1;
      c := sign * exp(n * ln(x)) / ((2 * n - 1) * fact);
      sign := -sign;
      fact := fact * (2 * (n + 1)) * (2 * (n + 1) + 1);

      if Abs(c) > Err
      then
        Recur := c + Recur(x, n + 1)
      else
        begin
          Recur := c;
          level := 1;
        end;
    end
  else
    begin
      c    := sign * exp(n * ln(x)) / ((2 * n - 1) * fact);
      sign := -sign;
      fact := fact * (2 * (n + 1)) * (2 * (n + 1) + 1);

      if Abs(c) > Err
      then
        Recur := c + Recur(x, n + 1)
      else
        begin
          Recur := c;
          level := n;
        end;
    end;
end;

var
  x : double;
begin
  x := 0.2;
  Repeat
    Writeln('x= ', x : 1 : 1, '  f= ', Recur(x, 1) : 2 : 4, ' n=', level);
    x := x + 0.1
  until x >= 2.001;
  readln;
end.




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Koschei
Дата 29.10.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все спасибо огромное программа отлично работает!
p.s.Ток один вопрос зачем в ответе n выводится?
PM MAIL   Вверх
Alexeis
Дата 29.10.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Koschei @  29.10.2006,  21:12 Найти цитируемый пост)
p.s.Ток один вопрос зачем в ответе n выводится? 

Так это и есть уровень рекурсии (или ее глубина)  который требовался по условию. Он же и является числом членов вычисленных в сумме.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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