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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] Факториал, процедура вычисления факториала 
V
    Опции темы
Hely
Дата 6.5.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дан ряд (в прикрепленной картинке). Там есть факториал. Его нужно вычислять с помощью рекусивной функции. Я, наверно, не буду вставлять весь код программы, а только напишу свою функицю вычисления факториала:

Код

function Fakt(k: integer): longint;
  begin
    if k=1 then
      Fakt:=1
    else
      Fakt:=k*Fakt(k-1);
  end;


Код вроде бы правильный, а не работает...  smile 
Почему?

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  4.JPG 1,97 Kb
PM MAIL ICQ Skype   Вверх
JAPH
Дата 6.5.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Лучше уж полный код. Здесь ошибки не видно


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
anwe
Дата 6.5.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Hely, у тебя сумма от нуля и тривиальное решение факторила при к=0. А чтобы не уйти в минус задай к, допустим Word:
Код

function Fakt(k: Word): longint;
  begin
    if k=0 then
      Result:=1
    else
      Result:=k*Fakt(k-1);
  end;

PM MAIL   Вверх
Hely
Дата 7.5.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так. Выставляю код вычисления данного ряда с исправленной функией факторила (спасибо 
anwe   smile )...

Код

procedure TForm1.Button5Click(Sender: TObject);
var
  k,n: integer;
  s1,s2,se,y: real;
function Fakt(k: word): longint;
  begin
    if k=0 then
      Fakt:=1
    else
      Fakt:=k*Fakt(k-1);
  end;
begin
  n:=strtoint(edit4.Text);
  y:=0;
  for k:=0 to n do
    begin
      if k mod 2<>0 then
        s1:=-1
      else
        s1:=1;
      s2:=1/(fakt(k)*fakt(k+1));
      se:=s1*s2;
      y:=y+se;
    end;
  label5.Caption:=floattostr(y);
end; 


Считала вручную, ответы мои и программы сходятся!  smile 
PM MAIL ICQ Skype   Вверх
Romkin
Дата 8.5.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Млин... Ну кто же так ряды-то считает?! smile 
Первое же упрощение, очевидное:
Код

begin
  n:=strtoint(edit4.Text);
  y:=0;
  s1 := 1;
  for k:=0 to n do
    begin
      s2:=1/(sqr(fakt(k))*(k+1));
      se:=s1*s2;
      y:=y+se;
      s1 := -s1;
    end;
  label5.Caption:=floattostr(y);
end; 

уже ускоряет программу smile
Можно и вообще без факториала сделать. Тут-то задача не в том, чтобы тупо посчитать, но и подумать!
И основное, о чем надо думать, это о том, что (k+1)! = k!*(k+1), а они у тебя последовательно считаются! smile 
Эх. Посадить бы тебя за терминал СМ4, тогда бы понял...
PM ICQ   Вверх
Hely
Дата 8.5.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Romkin, вообще-то я на 1 курсе и никогда до этого ряды не считала!
И еще: Я ДЕВУШКА!
А факториал там обязательно должен быть, в задании так сказано...
PM MAIL ICQ Skype   Вверх
Romkin
Дата 10.5.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Hely @  8.5.2007,  22:48 Найти цитируемый пост)
И еще: Я ДЕВУШКА!

Прощу прощения, профиль не посмотрел. Сочувствую ;)
В задании сказано "считать через факториал"? Вот это странно. Обычно все суммы рядов считают так, чтобы каждый следующий член ряда считался на основе предыдущего. 
У меня было еще жесче: взять столько членов суммы, сколько надо для данной точности ;) И тоже на первом курсе smile
PM ICQ   Вверх
Hely
Дата 10.5.2007, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



keenara, кому-то может что-то на занятиях дают, а я заочно учусь, нифига нам ничего нормально не дают! Так что сравнить это вообще сложно...
Дело еще и в том, что ту фукнцию факториала, которую я первую написала, я скопировала из методического пособия для моих контрольных работ, которое писали профессоры нашего универа... Поэтому у меня в голове не укладывалось, почему он не работает! Они, выходит, тоже начали "тупо" считать?!


Romkin, при чем тут "сочувствую"? Правильно писать "завидую"!  smile 

PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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