Mi oppongo a qualcosa che continuo a vedere più volte nella maggior parte di queste risposte, che ciò che rende una funzione una funzione è che restituisce un valore.
Una funzione non è solo un vecchio metodo che restituisce un valore. Non è così: Affinché un metodo sia una funzione reale, deve restituire lo stesso valore sempre con un input specifico. Un esempio di un metodo che non è una funzione è il random
metodo nella maggior parte delle lingue, poiché sebbene restituisca un valore, il valore non è sempre lo stesso.
Una funzione quindi è più simile a una mappa (ad es. Dove x -> x'
per una funzione unidimensionale). Questa è una distinzione molto importante tra metodi e funzioni regolari perché quando si tratta di funzioni reali i tempi e l'ordine in cui vengono valutati non dovrebbero mai importare dove non è sempre il caso delle non funzioni.
Ecco un altro esempio di un metodo che non è una funzione ma che comunque restituirà comunque un valore.
// The following is pseudo code:
g(x) = {
if (morning()) {
g = 2 * x;
}
else {
g = x;
}
return g;
}
Mi oppongo ulteriormente all'idea che le procedure non restituiscono valori. Una procedura è solo un modo specifico di parlare di una funzione o di un metodo. Ciò significa che se il metodo sottostante che la procedura definisce o implementa restituisce un valore, indovina quale procedura restituisce un valore. Prendi ad esempio il seguente frammento dal 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))))))
Hai sentito parlare di procedure ricorsive molto recentemente? Stanno parlando di una funzione ricorsiva (una funzione reale) e sta restituendo un valore e stanno usando la parola "procedura". Allora, qual è la differenza?
Bene, un altro modo di pensare a una funzione (oltre al significato sopra menzionato) è come una rappresentazione astratta di un ideale come il numero 1. Una procedura è quella effettiva attuazione di quella cosa. Personalmente penso che siano intercambiabili.
(Nota, se leggi quel capitolo dal link che fornisco potresti scoprire che un concetto più difficile da comprendere non è la differenza tra una funzione e una procedura, ma un processo e una procedura. Sapevi che una procedura ricorsiva può avere un processo iterativo?)
Un analogo per le procedure sono le ricette. Per esempio; supponiamo di avere una macchina chiamata make-pies
questa macchina prende gli ingredienti (fruit, milk, flower, eggs, sugar, heat)
e questa macchina restituisce a pie
.
Potrebbe apparire una rappresentazione di questa macchina
make-pies (fruit, milk, flower, eggs, sugar, heat) = {
return (heat (add fruit (mix eggs flower milk)))
}
Ovviamente non è l'unico modo per fare una torta.
In questo caso possiamo vedere che:
A function is to a machine
as a procedure is to a recipe
as attributes are to ingredients
as output is to product
Tale analogia è OK ma si interrompe quando si considera che quando si ha a che fare con un programma per computer tutto è un'astrazione. Quindi, diversamente dal caso di una ricetta con una macchina, stiamo confrontando due cose che sono esse stesse astrazioni; due cose che potrebbero anche essere la stessa cosa. E ritengo che siano (a tutti gli effetti) la stessa cosa.