Objeto con algo que sigo viendo una y otra vez en la mayoría de estas respuestas, que lo que hace que una función sea una función es que devuelve un valor.
Una función no es un método cualquiera que devuelve un valor. No es así: para que un método sea una función real, debe devolver el mismo valor siempre dado una entrada específica. Un ejemplo de un método que no es una función es el random
método en la mayoría de los idiomas, porque aunque devuelve un valor, el valor no siempre es el mismo.
Por lo tanto, una función es más parecida a un mapa (por ejemplo, dónde x -> x'
para una función unidimensional). Esta es una distinción muy importante entre los métodos y funciones regulares porque cuando se trata de funciones reales, el tiempo y el orden en que se evalúan nunca deberían importar dónde, ya que este no es siempre el caso con las no funciones.
Aquí hay otro ejemplo de un método que no es una función pero que de lo contrario devolverá un valor.
// The following is pseudo code:
g(x) = {
if (morning()) {
g = 2 * x;
}
else {
g = x;
}
return g;
}
Además, me opongo a la idea de que los procedimientos no devuelven valores. Un procedimiento es solo una forma específica de hablar sobre una función o método. Eso significa que si el método subyacente que su procedimiento define o implementa devuelve un valor, entonces adivine qué procedimiento devuelve un valor. Tomemos, por ejemplo, el siguiente fragmento del 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))))))
¿Has oído hablar de procedimientos recursivos mucho últimamente? Están hablando de una función recursiva (una función real) y está devolviendo un valor y están usando la palabra "procedimiento". Entonces, ¿cuál es la diferencia?
Bueno, otra forma de pensar en una función (además del significado mencionado anteriormente) es como una representación abstracta de un ideal como el número 1. Un procedimiento es la implementación real de esa cosa. Personalmente, creo que son intercambiables.
(Tenga en cuenta que si lee ese capítulo desde el enlace que proporciono, puede encontrar que un concepto más difícil de comprender no es la diferencia entre una función y un procedimiento, sino un proceso y un procedimiento. ¿Sabía que un procedimiento recursivo puede tener un ¿proceso iterativo?)
Un análogo para los procedimientos son las recetas. Por ejemplo; supongamos que tiene una máquina llamada make-pies
esta máquina que toma ingredientes de (fruit, milk, flower, eggs, sugar, heat)
y esta máquina devuelve a pie
.
Una representación de esta máquina podría verse así
make-pies (fruit, milk, flower, eggs, sugar, heat) = {
return (heat (add fruit (mix eggs flower milk)))
}
Por supuesto, esa no es la única forma de hacer un pastel.
En este caso podemos ver que:
A function is to a machine
as a procedure is to a recipe
as attributes are to ingredients
as output is to product
Esa analogía está bien, pero se rompe cuando se tiene en cuenta que cuando se trata de un programa de computadora todo es una abstracción. Entonces, a diferencia del caso de una receta con una máquina, estamos comparando dos cosas que son en sí mismas abstracciones; dos cosas que bien podrían ser lo mismo. Y sostengo que son (para todos los efectos) la misma cosa.