Автор Тема: математическ функции в Delphi - факториал...  (Прочитано 8857 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Иринкаа

  • Постоялец
  • ***
  • Сообщений: 133
  • Карма: -33
  • Пол: Женский
    • Просмотр профиля
Подскажите, пожалуйста, может кто-нибудь знает
как обозначает ф-ция факторила (математически это n!)
и как записать е в какой-то степени? как е обозначается?


Оффлайн BL@CK

  • Пользователь
  • **
  • Сообщений: 59
  • Карма: 8
  • Пол: Мужской
    • Просмотр профиля
как обозначает ф-ция факторила (математически это n!)
Такой функции нет, ее нужно написать самостоятельно

как записать е в какой-то степени? как е обозначается?
е в степени 2: exp(2)

VoroShiloV

  • Гость
function fuck(n:integer):integer;
var i:integer;
begin
result:=0;
for i:=1 to n do result:=result*i
end;

//Вызов её

peremennaja:=fuck(3);

Alexion

  • Гость
ммммм.... А разве она не будет все время 0 выдавать?

Оффлайн BL@CK

  • Пользователь
  • **
  • Сообщений: 59
  • Карма: 8
  • Пол: Мужской
    • Просмотр профиля
function fuck(n:integer):integer;
var i:integer;
begin
result:=1;
for i:=2 to n do result:=result*i
end;

//Вызов её

peremennaja:=fuck(3);

Теперь все должно работать!   ;--p

Оффлайн K@TZZ0!!!

  • Постоялец
  • ***
  • Сообщений: 217
  • Карма: 217
  • Пол: Мужской
  • D 'n 'B
    • Просмотр профиля
Во как много нуроду Дельфи знает. А мож кто нить сможет написать функцию вычисления быстрого преобразования Фурье? Для 8 отсчетов.

Оффлайн LEO

  • Ветеран
  • *****
  • Сообщений: 4417
  • Карма: 310
  • Пол: Мужской
    • Просмотр профиля
Во как много нуроду Дельфи знает. А мож кто нить сможет написать функцию вычисления быстрого преобразования Фурье? Для 8 отсчетов.
сможет.
http://is.gd/fpTeSMПродам книжки про Ajax и ASP.NET, http://is.gd/lDL64HПриглашаю в Dropbox

Оффлайн Иринкаа

  • Постоялец
  • ***
  • Сообщений: 133
  • Карма: -33
  • Пол: Женский
    • Просмотр профиля
спасибо за разъяснения :-)

Оффлайн exBoMBeR

  • Ветеран
  • *****
  • Сообщений: 21189
  • Карма: -245
  • Пол: Мужской
    • Просмотр профиля
function fuck(n:integer):integer;
var i:integer;
begin
result:=1;
for i:=2 to n do result:=result*i
end;

//Вызов её

peremennaja:=fuck(3);

Теперь все должно работать!   ;--p
Тоже не совсем коректно ... а в случае fuck(1) что будет? а если fuck(0)?
Надо так:

function fuck(n:integer):integer;
  var i:integer;
begin
  if n = 0 then result := 0
  else result := 1;
  if n > 1 then for i:=2 to n do result := result*i;
end;
«И нет величия там, где нет простоты, добра и правды». Лев Николаевич Толстой.

Оффлайн Иринкаа

  • Постоялец
  • ***
  • Сообщений: 133
  • Карма: -33
  • Пол: Женский
    • Просмотр профиля
0! = 1
так что при n=0 - result:=1

Оффлайн LEND

  • Пользователь
  • **
  • Сообщений: 95
  • Карма: 155
  • Истина как всегда где-то рядом
    • Просмотр профиля
Привет всем участникам темы.

Да, для пустого множества принимается соглашение: пустое множество можно упорядочить только одним способом. Поэтому считается, что
       0!=1

Расчет самого факториала почти все написали правильно

1-я конструкция.
 
function fuck(n:integer):integer;
  var i:integer;
begin
  if n = 0 then result := 0
  else result := 1;
  if n > 1 then for i:=2 to n do result := result*i;
end;

Здесь при n=0 result должен быть равен 1
  тогда   if n = 0 then result :=1 else result := 1;

Но есть ошибки - скажу по ходу.


Эта конструкция (2-я) как не парадоксально но то же верна.

function fuck(n:integer):integer;
var i:integer;
begin
result:=1;
for i:=2 to n do result:=result*i
end;


Те же  ошибки.

Ошибки:
1) Ребята это же функция и она должна возращать значение самой функции fuck:=result;
2) и result надо описать в разделе var самой функции
    Вот тогда получится peremennaja:=fuck(3)

Если ВЫ используете ее как процедуру - то это очень неудобно.
ВАМ просто придется представить переменную result как глобальную переменную т.е. в начале программы.
И вы не сможете написать вот так: peremennaja:=fuck(3) и результат будет выдавать сама переменная result


 
Тогда обе конструкции надо писать вот так

function fuck(n:integer):integer;
  var
           i:integer;
    result:integer;
begin
  if n = 0 then result := 1 else result := 1;
  if n > 1 then for i:=2 to n do result := result*i;
  fuck:=result;
end;


function fuck(n:integer):integer;
var
       i:integer;
result:integer;

begin
result:=1;
for i:=2 to n do result:=result*i
fuck:=result;
end;





Если не верите что 2-я конструкция то же верна - можете проверить:
Это ПАСКАЛЬ.

uses crt;
var
n:integer;

{--------------------------------- Функция fuck ----------------------------------}
function fuck(n:integer):integer;
var
    i:integer;
    result:integer;}
begin
result:=1;
for i:=2 to n do result:=result*i;
                              {Можно поиэксперементировть и сделать for i:=2 to 0 do result:=result*i;}
                              {Посмотрите что получится?}

fuck:=result;
end;
{----------------------------------------------------------------------------------}


BEGIN
ClrScr;
writeln('Введите N и нажмите ENTER');
write('N=');
read(n);
writeln('Факториал от ',n,' равен fuck=',fuck(n));
writeln('Нажмите любую клавишу - Выход');
readkey;
END.


Я бы сделал еще проще:


function fuck(n:byte):longint;
begin
{Pn=1*2*3...(n-1)*n=n!}
  if n=0 then fuck:=1 else fuck:=fuck(n-1)*n
end;


Ну если хотите то заголовок может быть function fuck(n:integer):integer;

Вроде бы просили эту функцию написать на DELPHI, т.е. в программе на DELPHI ..................


С уважением
LEND
« Последнее редактирование: 15.11.07, 21:31:40 от LEND »
В мире временном, сущность которого - тлен,
Не сдавайся вещам несущественным в плен. © О.Х.

Оффлайн K@TZZ0!!!

  • Постоялец
  • ***
  • Сообщений: 217
  • Карма: 217
  • Пол: Мужской
  • D 'n 'B
    • Просмотр профиля
Ошибки:
1) Ребята это же функция и она должна возращать значение самой функции fuck:=result;
2) и result надо описать в разделе var самой функции
    Вот тогда получится peremennaja:=fuck(3)

Если ВЫ используете ее как процедуру - то это очень неудобно.
ВАМ просто придется представить переменную result как глобальную переменную т.е. в начале программы.
И вы не сможете написать вот так: peremennaja:=fuck(3) и результат будет выдавать сама переменная result
Для Паскаля это катит. Но это ж Дельфи, переменную result объявлять не надо. Она уже зашита в компилятор, как возвращаемое функцией значение.

Оффлайн LEO

  • Ветеран
  • *****
  • Сообщений: 4417
  • Карма: 310
  • Пол: Мужской
    • Просмотр профиля
Я бы сделал еще проще:


function fuck(n:byte):longint;
begin
{Pn=1*2*3...(n-1)*n=n!}
  if n=0 then fuck:=1 else fuck:=fuck(n-1)*n
end;

стек переполнить не боитесь? =)

хотя, наверное, максимальное возвращаемое значение, вызванное ограничением возвращаемого типа данных, слишком мало, что чтобы стек переполнился =)
да и параметр n:byte этого конечно не позволит ))

хотя, не спорю, способ действительно самый изящный с точки зрения кода  ;--p
http://is.gd/fpTeSMПродам книжки про Ajax и ASP.NET, http://is.gd/lDL64HПриглашаю в Dropbox

Оффлайн LEND

  • Пользователь
  • **
  • Сообщений: 95
  • Карма: 155
  • Истина как всегда где-то рядом
    • Просмотр профиля
Уважаемый K@TZZ0!!!
Вы внимательно прочитайте что я написал.
Особенно эту фразу

Вроде бы просили эту функцию написать на DELPHI, т.е. в программе на DELPHI ..................

Да, я написал это под ПАСКАЛЬ, но
                                          с точки зрения ПРАВИЛЬНОСТИ УКАЗАННЫХ ПРЕДЛОЖЕННЫХ КОНСТРУКЦИЙ
                                                                получения ФАКТОРИАЛА
Эти конструкции я просто проверил на ПАСКАЛЕ, т.к. у меня не установлен DELPHI.

И я прекрасно знаю, что внутри любой функции в DELPHI определена переменная Result, в которой и помещается результат, возвращаемой функции. Она имеет тот же тип, что и сама функция, и может использоваться внутри функции. И если функции или переменной Result не присвоено значение, значение переменной Result неопределено.

Но вот в чем дело. Я написал рекурсивную функцию
 
function fuck(n:byte):longint;
 begin
  {Pn=1*2*3...(n-1)*n=n!}
  if n=0 then fuck:=1 else fuck:=fuck(n-1)*n
end;


Использование же в этом случае вместо имени функции перменной Result не вызовет рекурсивного обращения, так как эта переменная даст текущее значение функции.

И ВЫ наверно хорошо знающий DELPHI должны это знать.
А мне такие функции как ФАКТОРИАЛ удобно решать по выше приведенной конструкции.


Ну вот и все
А насчет DELPHI - вот и дайте описание модуля вместе с функцией.
Ведь просили эту функцию написать на DELPHI, т.е. в программе на DELPHI ..................
С уважением
LEND
                             
   
В мире временном, сущность которого - тлен,
Не сдавайся вещам несущественным в плен. © О.Х.

Оффлайн WhiteBear

  • Пользователь
  • **
  • Сообщений: 54
  • Карма: 6
    • Просмотр профиля
Я бы сделал еще проще:


function fuck(n:byte):longint;
begin
{Pn=1*2*3...(n-1)*n=n!}
  if n=0 then fuck:=1 else fuck:=fuck(n-1)*n
end;

стек переполнить не боитесь? =)
Это tail-рекурсия. Нормальные компиляторы ее оптимизируют, только вот к delphi это не относится.

Оффлайн K@TZZ0!!!

  • Постоялец
  • ***
  • Сообщений: 217
  • Карма: 217
  • Пол: Мужской
  • D 'n 'B
    • Просмотр профиля
Ну во всяком случае рекурсивный вызов не так хорош. Более быстро происходит вычесление без рекурсии. Т.к. не требуется сохранять контекст. к тому же при большом значении факториала возможно переполнение стека.     :-)

Оффлайн WhiteBear

  • Пользователь
  • **
  • Сообщений: 54
  • Карма: 6
    • Просмотр профиля
Ну во всяком случае рекурсивный вызов не так хорош. Более быстро происходит вычесление без рекурсии. Т.к. не требуется сохранять контекст. к тому же при большом значении факториала возможно переполнение стека.     :-)
Во большинстве случаев такой код нагляднее, поэтому и приходится жертвовать скоростью выполнения. Но еще раз повторюсь, нормальные компиляторы tail-рекурсию разворачивают в цикл.