Ich widerspreche etwas, das ich in den meisten dieser Antworten immer wieder sehe. Was eine Funktion zu einer Funktion macht, ist, dass sie einen Wert zurückgibt.
Eine Funktion ist nicht irgendeine alte Methode, die einen Wert zurückgibt. Nicht so: Damit eine Methode eine echte Funktion ist, muss sie immer den gleichen Wert zurückgeben, wenn eine bestimmte Eingabe erfolgt. Ein Beispiel für eine Methode, die keine Funktion ist, ist die random
Methode in den meisten Sprachen, da der Wert nicht immer gleich ist, obwohl er einen Wert zurückgibt.
Eine Funktion ähnelt daher eher einer Karte (z. B. wo x -> x'
für eine eindimensionale Funktion). Dies ist eine sehr wichtige Unterscheidung zwischen regulären Methoden und Funktionen, da beim Umgang mit realen Funktionen das Timing und die Reihenfolge, in der sie ausgewertet werden, keine Rolle spielen sollten, da dies bei Nichtfunktionen nicht immer der Fall ist.
Hier ist ein weiteres Beispiel für eine Methode, die keine Funktion ist, aber ansonsten trotzdem einen Wert zurückgibt.
// The following is pseudo code:
g(x) = {
if (morning()) {
g = 2 * x;
}
else {
g = x;
}
return g;
}
Ich lehne ferner den Gedanken ab, dass Prozeduren keine Werte zurückgeben. Eine Prozedur ist nur eine bestimmte Art, über eine Funktion oder Methode zu sprechen. Das heißt, wenn die zugrunde liegende Methode, die Ihre Prozedur definiert oder implementiert, einen Wert zurückgibt, raten Sie, was diese Prozedur einen Wert zurückgibt. Nehmen Sie zum Beispiel den folgenden Ausschnitt aus dem SICP :
// We can immediately translate this definition into a recursive procedure
// for computing Fibonacci numbers:
(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))
Haben Sie in letzter Zeit viel von rekursiven Prozeduren gehört? Sie sprechen von einer rekursiven Funktion (einer realen Funktion), die einen Wert zurückgibt, und sie verwenden das Wort "Prozedur". Was ist dann der Unterschied?
Nun, eine andere Art, eine Funktion zu denken (neben der oben erwähnten Bedeutung), ist die abstrakte Darstellung eines Ideals wie der Ziffer 1. Eine Prozedur ist die tatsächliche Implementierung dieser Sache. Ich persönlich denke, dass sie austauschbar sind.
(Beachten Sie, wenn Sie dieses Kapitel über den von mir bereitgestellten Link lesen, werden Sie möglicherweise feststellen, dass ein schwieriger zu fassendes Konzept nicht der Unterschied zwischen einer Funktion und einer Prozedur ist, sondern ein Prozess und eine Prozedur. Wussten Sie, dass eine rekursive Prozedur eine haben kann? iterativer Prozess?)
Ein Analogon für Prozeduren sind Rezepte. Beispielsweise; Angenommen, Sie haben eine Maschine namens make-pies
Diese Maschine nimmt Zutaten auf (fruit, milk, flower, eggs, sugar, heat)
und diese Maschine gibt a zurück pie
.
Eine Darstellung dieser Maschine könnte aussehen
make-pies (fruit, milk, flower, eggs, sugar, heat) = {
return (heat (add fruit (mix eggs flower milk)))
}
Natürlich ist das nicht der einzige Weg, einen Kuchen zu machen.
In diesem Fall können wir Folgendes sehen:
A function is to a machine
as a procedure is to a recipe
as attributes are to ingredients
as output is to product
Diese Analogie ist in Ordnung, bricht jedoch zusammen, wenn Sie berücksichtigen, dass beim Umgang mit einem Computerprogramm alles eine Abstraktion ist. Anders als bei einem Rezept mit einer Maschine vergleichen wir zwei Dinge, die selbst Abstraktionen sind. zwei Dinge, die genauso gut dasselbe sein könnten. Und ich bin der Meinung, dass sie (für alle Absichten und Zwecke) dasselbe sind.