Я возражаю против чего-то, что я вижу в большинстве этих ответов снова и снова, что функция превращается в функцию в том, что она возвращает значение.
Функция - это не просто старый метод, который возвращает значение. Не так: чтобы метод был реальной функцией, он должен возвращать одно и то же значение, всегда учитывая конкретный вход. Примером метода, который не является функцией, является метод 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
Эта аналогия в порядке, но она нарушается, если принять во внимание, что когда вы имеете дело с компьютерной программой, все является абстракцией. Так что в отличие от рецепта машины, мы сравниваем две вещи, которые сами по себе являются абстракцией; две вещи, которые могут быть одинаковыми. И я считаю, что они (для всех намерений и целей) одно и то же.