Я возражаю против чего-то, что я вижу в большинстве этих ответов снова и снова, что функция превращается в функцию в том, что она возвращает значение.
Функция - это не просто старый метод, который возвращает значение. Не так: чтобы метод был реальной функцией, он должен возвращать одно и то же значение, всегда учитывая конкретный вход. Примером метода, который не является функцией, являетсяrandom
метод в большинстве языков, потому что, хотя он и возвращает значение, значение не всегда одинаково.
Поэтому функция больше похожа на карту (например, где x -> x'
для одномерной функции). Это очень важное различие между обычными методами и функциями, потому что при работе с реальными функциями время и порядок, в котором они оцениваются, никогда не должны иметь значения, поскольку это не всегда имеет место с не функциями.
Вот еще один пример метода, который не является функцией, но все равно будет возвращать значение.
// The following is pseudo code:
g(x) = {
if (morning()) {
g = 2 * x;
}
else {
g = x;
}
return g;
}
Я также возражаю против того, что процедуры не возвращают значений. Процедура - это просто особый способ говорить о функции или методе. Таким образом, это означает, что если базовый метод, который ваша процедура определяет или реализует, возвращает значение, то угадайте, что эта процедура возвращает значение. Возьмите, например, следующий фрагмент из 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))))))
Вы много слышали о рекурсивных процедурах в последнее время? Они говорят о рекурсивной функции (реальной функции), и она возвращает значение, и они используют слово «процедура». Так в чем же разница?
Ну и еще один способ мышления функции (помимо значения, упомянутого выше) - это абстрактное представление идеала, подобного цифре 1. Процедура - это фактическая реализация этой вещи. Я лично думаю, что они взаимозаменяемы.
(Обратите внимание, что если вы прочитаете эту главу по ссылке, которую я предоставляю, вы можете обнаружить, что более сложная концепция - это не разница между функцией и процедурой, а процесс и процедура. Знаете ли вы, что рекурсивная процедура может иметь итерационный процесс?)
Аналогом для процедур являются рецепты. Например; Предположим, у вас есть машина, которая называется make-pies
эта машина принимает ингредиенты, (fruit, milk, flower, eggs, sugar, heat)
и эта машина возвращает а pie
.
Представление этой машины может выглядеть так
make-pies (fruit, milk, flower, eggs, sugar, heat) = {
return (heat (add fruit (mix eggs flower milk)))
}
Конечно, это не единственный способ сделать пирог.
В этом случае мы можем видеть, что:
A function is to a machine
as a procedure is to a recipe
as attributes are to ingredients
as output is to product
Эта аналогия в порядке, но она нарушается, если учесть, что когда вы имеете дело с компьютерной программой, все является абстракцией. Таким образом, в отличие от рецепта машины, мы сравниваем две вещи, которые сами являются абстракцией; две вещи, которые могут быть одинаковыми. И я считаю, что они (для всех намерений и целей) одно и то же.