Was ist der Unterschied zwischen Funktionen in der Mathematik und Funktionen in der Programmierung?

Lesezeit: 9 Minuten

Benutzer-Avatar
Alon Gubkin

Was ist der Unterschied zwischen Funktionen in der Mathematik und Funktionen in der Programmierung?

  • Es ist zu beachten, dass nicht alle Funktionen in der Programmierung gleich sind. In einer rein funktionalen Programmiersprache wie Haskell sind Funktionen näher an Funktionen in der Mathematik. In imperativen Sprachen können sie ganz anders sein.

    – Jacob

    31. August 2010 um 1:22 Uhr

  • Hatten Sie eine bestimmte Programmiersprache im Sinn?

    – Brian

    31. August 2010 um 1:24 Uhr

  • Ja, ich spreche von C-Funktionen.

    – Alon Gubkin

    31. August 2010 um 1:38 Uhr

Benutzer-Avatar
Marco

In der funktionalen Programmierung haben Sie Referenzielle Transparenzwas bedeutet, dass Sie eine Funktion durch ihren Wert ersetzen können, ohne das Programm zu ändern. Das ist Stimmt in Mathe auch, aber das ist nicht immer wahr in imperativen Sprachen.

EIN mathematische Funktion ist definiert durch: eine Beziehung, die Elemente von einem Satz (A) auf einen anderen (B) abbildet, wobei jedes Element des ersten Satzes nur einem der anderen Sätze zugeordnet wird. In C (wie in anderen Programmiersprachen) gilt dies auch, Sie haben Ihren Eingabesatz und Ihren Ausgabesatz (der fast immer nur EINS ist).

Der Hauptunterschied besteht also darin STETS wenn du anrufst f(x) In Mathe erhalten Sie die gleiche Antwort, aber wenn Sie anrufen f'(x) In C ist die Antwort möglicherweise nicht dieselbe (auf dieselben Argumente wird nicht dieselbe Ausgabe ausgegeben). .. aber was es zu sagen versucht, ist, dass eine Funktion in nicht-funktionalen Sprachen möglicherweise nicht nur von den Argumenten abhängt, die Sie ihnen geben, sondern von anderen Dingen des Programms)

Ein weiterer Unterschied zwischen mathematischen und C-Funktionen besteht darin, dass Sie in Math keine Funktion erstellen können, die von einer nicht leeren Menge zu einer leeren Menge führt (in C wäre dies: Sie müssen nicht immer etwas mit Ihrer Funktion zurückgeben ). Auch sind nicht alle Funktionen vorhanden berechenbar (Ich weiß nicht, ob es in Mathe etwas Ähnliches gibt..). Sie haben keine Funktionen für unendliche Mengen (Sie haben endlichen Speicher, also muss die Menge der möglichen Eingabeparameter endlich sein), aber in Mathematik können Sie eine Funktion für unendliche Mengen definieren (wie f: N -> N) und zum unzählbar Mengen (wie f: R -> R) (In C gibt es Fließkommazahlen, aber sie stellen nur eine reduzierte Menge reeller Zahlen dar, die endlich ist).

Zusammenfassend:

In C haben Sie nicht immer referenzielle Transparenz. Ihre Funktionen geben möglicherweise nicht immer die gleiche Ausgabe für die gleichen Eingabeparameter. Sie können mathematische Funktionen haben, die für einen unendlichen Satz von Eingaben definiert sind, aber in C-Funktionen ist Ihre Eingabe endlich. In C-Funktionen können Sie Funktionen haben, die nichts zurückgeben, aber in Math können Sie das nicht haben (wenn Sie eine Funktion haben, die einen nicht leeren Eingabesatz hat, müssen Sie jedes Element einem anderen Satz zuordnen).

  • Es gibt andere Programmierparadigmen als Functional und Imperative, aber ich glaube nicht, dass ich genug über sie weiß, um richtig zu antworten.

    – Marco

    31. August 2010 um 2:40 Uhr

  • Logikprogrammierung oder Constraint-Engines können Sie sehen, dass sie viel deklarativer sind wie Mathematik im Gegensatz zu C, das im Allgemeinen zwingend erforderlich ist. Funktionale Programmierung kann auch ziemlich deklarativ sein, aber die anderen Paradigmen machen es meiner Meinung nach offensichtlicher

    – jk.

    31. August 2010 um 8:50 Uhr

  • Mit anderen Worten: C-Funktionen müssen nicht “rein” sein (wie in en.wikipedia.org/wiki/Pure_function).

    Benutzer395760

    31. August 2010 um 16:07 Uhr


  • Das ist richtig delnan, ich wusste nicht, dass sie “Pure Functions” heißen

    – Marco

    31. August 2010 um 16:14 Uhr

  • Ich habe mich geirrt, was das Beweisen von Dingen in Mathematik angeht. Die Sache ist, dass Sie beweisen können, dass eine C-Funktion eine formale Spezifikation erfüllt, und es ist äquivalent zu dem Beweis, dass eine mathematische Funktion einige Eigenschaften erfüllt. Aber es gibt keine Beziehung zur Komplexität, etwas zu beweisen. Ich habe meinen Beitrag bearbeitet und etwas über die Domäne des Eingabesatzes hinzugefügt und berechenbare Funktionen erwähnt.

    – Marco

    31. August 2010 um 22:51 Uhr

Es hängt von der Domäne ab (ich meine nicht die Domäne der Funktion, ich meine die Domäne des Studiums) und möglicherweise auch die Sprache.

In der Mathematik hat eine Funktion einen Eingang, der nur einem Ausgang für einen bestimmten Eingangswert zugeordnet ist (vertikaler Linientest, denken Sie daran). Bei der Programmierung ist dies möglicherweise nicht genau dasselbe, je nachdem, wo Sie die Grenze zwischen “Eingabe” und “Funktionslogik” ziehen.

Stellen wir uns zum Beispiel vor, wir haben eine Funktion rand(), die die atmosphärischen Bedingungen liest, um zu einer echten Zufallszahl zu gelangen. Stellen wir uns auch vor, dass eine aufrufende Funktion einen ganzzahligen Parameter als eine Art Multiplizierer verwendet. Ist folgendes eine Funktion?:

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

Im mathematischen Sinne ist es wahrscheinlich keine Funktion, wenn Sie mult als einzige Eingabe für das Problem betrachten, aber rand() bietet eindeutig auch Eingaben (obwohl rand() immer denselben Einstiegspunkt im Maschinencode hat).

Wie Sie sehen können, sind die Unterschiede ohne ein Standardprotokoll, dem alle zustimmen, nicht wirklich objektiv definierbar.

Ich denke, der wichtigste Unterschied ist, dass Funktionen in Mathematik (und funktionaler Programmierung) ihren Zustand nicht ändern können, während (imperative) Programmierfunktionen dies können.

Benutzer-Avatar
sdcvc

Andere Antworten sind richtig – das sind zwei verschiedene Dinge. Ich werde zeigen, im Gegenteil, sie sind verwandt. Ich werde Programmierfunktionen mit bezeichnen ->mathematische Funktionen durch =>.

Angenommen, Sie haben eine Sprache, die Ausnahmen unterstützt. In diesem Fall können Sie an eine Programmierfunktion denken A -> B als mathematische Funktion A => B + E wobei “B + E” entweder etwas vom Typ bedeutet Boder so ähnlich E. Ihre Sprache hat zwei Schlüsselwörter, um von einer Funktion zurückzukehren, “return” und “throw”.

Jetzt können Sie zwei Funktionen zusammenstellen f: A -> B und g: B -> C durch Schreiben g(f(x)). Dies ist eine Funktion, die ein A akzeptiert und C zurückgibt. Sie können dies in vielen Sprachen wie Java oder Python tun. Unter der Haube, ggf f(x) löst eine Ausnahme aus, g wird nicht aufgerufen und die Ausnahme wird propagiert – denken Sie darüber nach g(1/0). Die Sprache kümmert sich darum und Sie müssen nicht prüfen, ob das Ergebnis von f ist eine Ausnahme. Der Weg, dies mathematisch zu beschreiben, ist obwohl f: A => B+E und g: B => C+Edie Sprache “hebt” die Funktion g hinein B+E => C+E. g ist jetzt eine Funktion, die eine Ausnahme annehmen kann, diese aber einfach weitergibt.

Mit anderen Worten definieren g': B+E => C+E durch

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

Mit zwei Funktionen f: A => B+E und g': B+E => C+E Sie können sie sicher im mathematischen Sinne zusammensetzen. Und das ist was g(f(x)) in der Programmierung tut, aber es muss heben g hinein g' Erste.

Denken Sie an den Nichtdeterminismus. Wenn Sie eine Funktion haben A -> B das nicht deterministisch ist, dann können Sie es mathematisch beschreiben, indem Sie sagen, dass dies eine Funktion ist A => Set(B) wo Set(B) ist die Menge möglicher Ergebnisse. Zum Beispiel, wenn f(1) könnte Ihnen 1, 2 oder 3 geben, dann mathematisch f(1) = {1,2,3} obwohl während der Programmierung, wenn danach gefragt wird f(1) Sie erhalten nur eine dieser Nummern. Jetzt können Sie nichtdeterministische Funktionen erstellen A->B und B->C durch Schreiben g(f(x)). Das Ergebnis wird vom Typ sein C, aber es wird nicht deterministisch sein. Mathematisch das Zusammensetzen von Funktionen A => Set(B) und B => Set(C) gibt Ihnen A => Set(C). Obwohl g nimmt nur einen Wert von an Bmüssen Sie es auf nichtdeterministische Werte anheben g': Set(B) => Set(C). Zum Beispiel, g'({1,2}) ist Vereinigung von Mengen g(1) und g(2). So g(f(x)) bedeutet, dass du rennst fnehmen Sie alle möglichen Ergebnisse und führen Sie sie aus g auf jedem von ihnen. Es gibt zwei Ebenen des Nichtdeterminismus, aber sie sind zu einer “abgeflacht”.

Dasselbe gilt für den globalen Zustand. Wenn Sie jede globale Variable als Argument einer Funktion und des Ergebnisses machen, können Sie denken, dass es keine globalen Variablen gibt, jede Funktion den gesamten globalen Status übernimmt und die Sprache den Status beim Komponieren übergeben muss. Eine Funktion A -> B Lese- und ggf. Schreibzustand S ist eine Funktion (A,S) => (B,S)was auch geschrieben werden kann als A => (S => (B,S)). Dies formal zu schreiben ist komplizierter, aber es ist das gleiche Muster.

Dasselbe kann mit Ein-/Ausgabe gemacht werden, ich habe das in einer anderen SO-Antwort beschrieben.

Die “Magie”, die es erlaubt, “effektive” Funktionen zu erstellen, ist:

  • Eine Möglichkeit, den Typ wirksam zu machen. Wenden Sie sich zum Beispiel B hinein B+E oder Set(B). Ich bezeichne eine wirksame Version des Typs X wie F(X).
  • Eine Möglichkeit, die Funktionen zu heben: B -> F(C) hinein F(B) -> F(C). Es erlaubt, Funktionen zu komponieren A -> F(B) und B -> F(C).
  • Das Schlüsselwort return muss einen ordentlichen Wert drehen A hinein A+Eoder Einling Set(A). So muss sein Typ sein X -> F(X).

Eine Struktur, die aus diesen drei besteht, wird Monade genannt. Monaden erlauben es, diese Nebenwirkungen zu beschreiben. Eine Monade könnte auch einige spezifische Funktionen haben, zum Beispiel hat die Ausnahmemonade throwhat die Nichtdeterminismus-Monade forkhat die Zustandsmonade get/puthat die IO-Monade read/write usw.

Die Moral ist: Betrachtet man Spezialeffekte wie Randomisierung, Ausnahmen, Nichtdeterminismus, Input/Output als Teil des Ergebnisses einer Funktion, dann ist jede Funktion referenziell transparent und Funktionen in der imperativen Programmierung sind wirklich mathematische Funktionen, aber mit sehr seltsamen Ergebnistypen, die auch Spezialeffekte beschreiben. Diesen Ansatz verfolgen reine funktionale Sprachen wie Haskell.

Mathematische Funktionen sind deklarativer Natur, dh sie haben immer “Was ist”-Beschreibungen, während Funktionen in der Informatik zwingend sind, dh sie haben “Wie”-Beschreibungen.

Referenz: Struktur und Interpretation von Computerprogrammen.

In der Mathematik lösen Funktionen keine Ausnahmen aus. 🙂

Eine Funktion in der Informatik ist ein Stück Code, das Eingaben entgegennimmt, etwas tut und möglicherweise Ausgaben zurückgibt, aber dazwischen eine Menge Dinge tun kann. Es kann Webseiten abrufen, E-Mails senden, Videos abspielen, was auch immer.

In der Mathematik ist eine Funktion etwas sehr Spezifisches und nichts anderes. Eine Funktion wird normalerweise als “Maschine” beschrieben, die Eingaben aufnimmt und Ausgaben ausspuckt. Während Informatikfunktionen Eingaben aufnehmen und Ausgaben ausspucken, müssen sie dies nicht mit dem genauen “die gleiche Eingabe ergibt immer die gleiche Ausgabe” tun, die Mathematik erfordert (z. B. bool IsMyApplicationRunningInFullScreen() gibt verschiedene Werte ohne Eingaben zurück überhaupt).

1367870cookie-checkWas ist der Unterschied zwischen Funktionen in der Mathematik und Funktionen in der Programmierung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy