Je m'objecte avec quelque chose que je ne cesse de voir dans la plupart de ces réponses, que ce qui fait d'une fonction une fonction, c'est qu'elle renvoie une valeur.
Une fonction n'est pas n'importe quelle ancienne méthode qui renvoie une valeur. Ce n'est pas le cas: pour qu'une méthode soit une fonction réelle, elle doit renvoyer la même valeur, toujours avec une entrée spécifique. Un exemple de méthode qui n'est pas une fonction est la random
méthode dans la plupart des langues, car bien qu'elle renvoie une valeur, la valeur n'est pas toujours la même.
Une fonction est donc plus proche d'une carte (par exemple, où x -> x'
pour une fonction unidimensionnelle). Il s'agit d'une distinction très importante entre les méthodes et les fonctions régulières, car lorsqu'il s'agit de fonctions réelles, le moment et l'ordre dans lesquels elles sont évaluées ne devraient jamais avoir d'importance, car ce n'est pas toujours le cas pour les non fonctions.
Voici un autre exemple d'une méthode qui n'est pas une fonction mais qui, sinon, renverra toujours une valeur.
// The following is pseudo code:
g(x) = {
if (morning()) {
g = 2 * x;
}
else {
g = x;
}
return g;
}
Je m'oppose en outre à l'idée que les procédures ne renvoient pas de valeurs. Une procédure n'est qu'une manière spécifique de parler d'une fonction ou d'une méthode. Cela signifie donc que si la méthode sous-jacente que votre procédure définit ou implémente renvoie une valeur, devinez ce que cette procédure renvoie une valeur. Prenons par exemple l'extrait suivant du 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))))))
Avez-vous entendu parler des procédures récursives ces derniers temps? Ils parlent d'une fonction récursive (une fonction réelle) et cela renvoie une valeur et ils utilisent le mot "procédure". Alors, quelle est la différence, alors?
Une autre façon de penser une fonction (en plus du sens mentionné ci-dessus) est comme une représentation abstraite d'un idéal comme le chiffre 1. Une procédure est cette implémentation réelle de cette chose. Je pense personnellement qu'ils sont interchangeables.
(Remarque: si vous lisez ce chapitre à partir du lien que je fournis, vous constaterez peut-être qu'un concept plus difficile à saisir n'est pas la différence entre une fonction et une procédure, mais un processus et une procédure. Saviez-vous qu'une procédure récursive peut avoir un processus itératif?)
Un analogue pour les procédures sont les recettes. Par exemple; supposons que vous ayez une machine appelée make-pies
cette machine absorbe les ingrédients de (fruit, milk, flower, eggs, sugar, heat)
et cette machine retourne a pie
.
Une représentation de cette machine pourrait ressembler
make-pies (fruit, milk, flower, eggs, sugar, heat) = {
return (heat (add fruit (mix eggs flower milk)))
}
Bien sûr, ce n'est pas la seule façon de faire une tarte.
Dans ce cas, nous pouvons voir que:
A function is to a machine
as a procedure is to a recipe
as attributes are to ingredients
as output is to product
Cette analogie est correcte, mais elle se décompose lorsque vous tenez compte du fait que lorsque vous avez affaire à un programme informatique, tout est une abstraction. Donc, contrairement au cas d'une recette à une machine, nous comparons deux choses qui sont elles-mêmes des abstractions; deux choses qui pourraient tout aussi bien être la même chose. Et je soutiens qu'ils sont (à toutes fins utiles) la même chose.