Подтвердить что ты не робот

В чем разница между функциями в математике и функциями программирования?

В чем разница между функциями в математике и функциями в программировании?

4b9b3361

Ответ 1

В функциональном программировании вы Referential Transparency, что означает, что вы можете заменить функцию своим значением без изменения программы. Это значение истинно в Math, но это не всегда истинно на императивных языках.

Математическая функция определяется: отношением, которое отображает элементы из одного набора (A) в другое (B), сопоставляя каждый элемент первого набора только с одним из другого набора. В C (как и в других языках программирования) это также верно, у вас есть ваш набор входных данных, и ваш выходной набор (который почти всегда только один).

Главное отличие состоит в том, что ВСЕГДА, если вы вызываете f(x) в математике, вы получите тот же ответ, но если вы назовете f'(x) в C, ответ может не быть (одинаковые аргументы не получают одинакового вывода). (Я думаю, что это немного ложно. Если у вас есть две точно машины в одном статусе, они будут выводить то же самое... но то, что она пытается скажем, что функция в нефункциональных языках может не зависеть только от аргументов, которые вы им даете, но от других вещей программы)

Еще одна разница между математическими и C-функциями заключается в том, что в Math вы не можете сделать функцию, которая идет от непустого набора до пустого набора (в C это будет: вы не обязаны всегда возвращать что-то с вашей функцией). Кроме того, не все функции computable (я не знаю, есть ли что-то подобное в математике..), У вас нет функций для бесконечных множеств (у вас есть конечная память, поэтому набор возможных входных параметров должен быть конечным), но в математике вы можете определить функцию для бесконечных множеств (например, f: N → N) и для несчетные наборы (например, f: R → R) (в C у вас есть числа с плавающей запятой, но они только представляют собой приведенное множество вещественных чисел, которое конечно).

Наконец, знайте, что функциональное программирование - это самое близкое к математическим функциям, которое у вас есть, и вы можете использовать C как функциональный язык (или что-то в этом роде). Проверьте "Функциональный C"

Извините, если мой английский плохой, надеюсь, что мой ответ поможет вам.

Подведение итогов

В C вы не всегда имеете ссылочную прозрачность. Ваши функции могут не всегда давать одинаковый выход для одних и тех же входных параметров. Вы можете иметь математические функции, определенные для бесконечного набора входов, но в функциях C ваш вход конечен. В функциях C вы можете иметь функции, которые ничего не возвращают, но в Math вы не можете этого сделать (если у вас есть функция с непустым набором входных данных, вы должны сопоставить каждый элемент с одним из другого набора).

Ответ 2

Это зависит от области (я не имею в виду область функции, я имею в виду область исследования), а также, возможно, язык.

В математике функция имеет вход, который отображает только один вывод для заданного входного значения (проверка вертикальной линии, помните). В программировании это может быть не одно и то же, в зависимости от того, где вы рисуете линию между "входом" и "логикой функций".

Например, предположим, что мы имеем функцию rand(), которая читает атмосферные условия, чтобы прийти к действительно случайному числу. Предположим также, что вызывающая функция принимает один целочисленный параметр в качестве умножителя. Является ли следующая функция?:

int giveRandAtmosWithMul(int mult)
{
    return mult * rand();
}

В математическом смысле это, вероятно, не функция, если вы рассматриваете mult как единственный вход в проблему, но ясно, что rand() также предлагает вход (хотя rand() всегда имеет ту же точку входа в машине код).

Как вы можете видеть, различия не являются объективно определяемыми без стандартного протокола, на который все согласны.

Ответ 3

Я думаю, что самое важное отличие состоит в том, что функции в математике (и функциональном программировании) не могут изменять состояние, тогда как (императивные) функции программирования могут.

Ответ 4

Другие ответы верны - это две разные вещи. Я покажу, напротив, они связаны. Я буду обозначать функции программирования ->, математические функции =>.

Предположим, что у вас есть язык, который поддерживает исключения. В этом случае вы можете представить себе функцию программирования A -> B как математическую функцию A => B + E, где "B + E" означает либо что-то типа B, либо что-то типа E. В вашем языке есть два ключевых слова для возврата из функции, "возврат" и "бросок".

Теперь вы можете создать две функции f: A -> B и g: B -> C, написав g(f(x)). Это функция, которая принимает A и возвращает C. Вы можете сделать это на многих языках, таких как Java или Python. Под капотом, если f(x) выдает исключение, g не вызывается и исключение распространяется - подумайте о g(1/0). Язык позаботится об этом, и вам не нужно проверять, является ли результат f исключением. Способ математического описания, хотя f: A => B+E и g: B => C+E, язык "поднимает" функцию g в B+E => C+E. g теперь является функцией, которая может принимать исключение, но она будет просто распространять ее.

Другими словами, определите g': B+E => C+E на

        /   g(x)   if x ∈ B
g'(x)= |
        \   x      if x ∈ E

Имея две функции f: A => B+E и g': B+E => C+E, вы можете смело составить их в математическом смысле. И это то, что g(f(x)) в программировании, но сначала нужно поднять g на g'.

Подумайте о недетерминизме. Если у вас есть функция A -> B, которая является недетерминированной, то вы можете ее математически описать, говоря, что это функция A => Set(B), где Set(B) - множество возможных результатов. Например, если f(1) может дать вам 1, 2 или 3, то математически f(1) = {1,2,3}, хотя при программировании при запросе f(1) вы получите только одно из этих чисел. Теперь вы можете составить недетерминированные функции A->B и B->C, написав g(f(x)). Результат будет иметь тип C, но он будет недетерминирован. Математически составляющие функции A => Set(B) и B => Set(C) дают вам A => Set(C). Хотя g принимает только одно значение B, вы должны поднять его до недетерминированных значений g': Set(B) => Set(C). Например, g'({1,2}) является объединением множеств g(1) и g(2). Итак, g(f(x)) означает, что вы запускаете f, принимаете множество всех возможных результатов и запускаете g для каждого из них. Существует два слоя недетерминизма, но они "сплющены" в один.

То же самое с глобальным состоянием. Если вы сделаете каждую глобальную переменную как аргумент функции и результата, вы можете думать, что глобальных переменных нет, каждая функция принимает все глобальное состояние, а язык должен передать состояние при составлении. Функция A -> B чтения и, возможно, записи состояния S является функцией (A,S) => (B,S), которая также может быть записана как A => (S => (B,S)). Написание этого формально более сложное, но это тот же шаблон.

То же самое можно сделать с помощью ввода/вывода, я описал это в другом SO ответе.

"Магия", которая позволяет составлять "эффектные" функции, это:

  • Способ сделать тип эффектным. Например, поверните B в B+E или Set(B). Я буду обозначать эффективную версию типа X как f(x).
  • Способ поднять функции: B -> F(C) в F(B) -> F(C). Он позволяет создавать функции A -> F(B) и B -> F(C).
  • Ключевое слово return должно превратить обычное значение A в A+E или singleton Set(A). Поэтому он должен быть X -> F(X).

Структура, состоящая из этих трех, называется монадой. Монады позволяют описывать эти побочные эффекты. Монада может также иметь некоторые конкретные функции, например, монада исключения имеет throw, монада недедеминизма имеет fork, монада состояния имеет get/put, монада IO имеет read/write и т.д.

Мораль такова: если вы рассматриваете специальные эффекты, такие как рандомизация, исключения, недетерминизм, ввод/вывод как часть результата функции, то каждая функция является ссылочно прозрачной, а функции в императивном программировании действительно являются математическими функциями, но с очень странными типами результатов, которые также описывают специальные эффекты. Это подход, используемый чистыми функциональными языками, такими как Haskell.

Ответ 5

В математике функции не генерируют исключений.:)

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

В математике функция является чем-то очень специфичным и ничем иным. Функция обычно описывается как "машина", которая принимает входные данные и выплескивает выходы. В то время как функции компьютерной науки принимают входные данные и выплевывают выходы, им не нужно делать это, когда точный "тот же вход всегда дает тот же результат", который требуется математике (например, bool IsMyApplicationRunningInFullScreen() возвращает различные значения без входных данных вообще).

Ответ 6

Математические функции декларативны по своей природе, т.е. они всегда имеют "то, что есть", тогда как функции в информатике являются императивными, т.е. имеют "как" описания.

Ссылка: Структура и интерпретация компьютерных программ.