Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] Факториал


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

Код

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


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

Автор: JAPH 6.5.2007, 22:27
Лучше уж полный код. Здесь ошибки не видно

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

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

Автор: Hely 7.5.2007, 18:35
Так. Выставляю код вычисления данного ряда с исправленной функией факторила (спасибо 
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 

Автор: Romkin 8.5.2007, 09:59
Млин... Ну кто же так ряды-то считает?! 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, тогда бы понял...

Автор: Hely 8.5.2007, 22:48
Romkin, вообще-то я на 1 курсе и никогда до этого ряды не считала!
И еще: Я ДЕВУШКА!
А факториал там обязательно должен быть, в задании так сказано...

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

Прощу прощения, профиль не посмотрел. Сочувствую ;)
В задании сказано "считать через факториал"? Вот это странно. Обычно все суммы рядов считают так, чтобы каждый следующий член ряда считался на основе предыдущего. 
У меня было еще жесче: взять столько членов суммы, сколько надо для данной точности ;) И тоже на первом курсе smile

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


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

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