В чем разница между «функцией» и «процедурой»? - PullRequest
178 голосов
/ 06 апреля 2009

Вообще говоря, мы все слышим о функциях или процедурах в языках программирования. Однако я только что узнал, что я использую эти термины практически взаимозаменяемо (что, вероятно, очень неправильно).

Итак, мой вопрос:

В чем разница с точки зрения их функциональности, назначения и использования?

Пример был бы оценен.

Ответы [ 17 ]

2 голосов
/ 22 мая 2012

Функция возвращает значение, а процедура просто выполняет команды.

Название функции происходит от математики. Он используется для расчета значения на основе ввода.

Процедура - это набор команд, которые можно выполнить по порядку.

В большинстве языков программирования даже функции могут иметь набор команд. Следовательно, разница только в возврате части значения.

Но если вы хотите содержать функцию в чистоте (просто посмотрите на функциональные языки), вам нужно убедиться, что функция не имеет побочного эффекта.

1 голос
/ 24 февраля 2014

Я возражаю против чего-то, что я вижу в большинстве этих ответов снова и снова, что функция превращается в функцию в том, что она возвращает значение.

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

Эта аналогия в порядке, но она нарушается, если принять во внимание, что когда вы имеете дело с компьютерной программой, все является абстракцией. Так что в отличие от рецепта машины, мы сравниваем две вещи, которые сами по себе являются абстракцией; две вещи, которые могут быть одинаковыми. И я считаю, что они (для всех намерений и целей) одно и то же.

1 голос
/ 18 июля 2012

Функция может использоваться внутри оператора SQL, тогда как процедура не может использоваться в операторе SQL.

Операторы вставки, обновления и создания не могут быть включены в функцию, но процедура может иметь эти операторы.

Процедура поддерживает транзакции, но функции не поддерживают транзакции.

Функция должна возвращать одно и только одно значение (другое может быть возвращено переменной OUT), но процедура возвращает столько наборов данных и возвращаемых значений.

Планы выполнения функций и процедур кэшируются, поэтому производительность в обоих случаях одинакова.

0 голосов
/ 06 июля 2017

С точки зрения С # / Java, функция - это блок кода, который возвращает определенное значение, но процедура - это блок кода, который возвращает void * 1006. * (ничего такого). В C # / Java функции и процедуры чаще всего называются просто методами .

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }
0 голосов
/ 27 ноября 2016

В контексте дБ : Хранимая процедура представляет собой предварительно скомпилированный план выполнения, в котором функции отсутствуют.

0 голосов
/ 30 марта 2015

Процедуры и функции являются обеими подпрограммами. Разница между ними only в том, что процедура возвращает множественные (или, по крайней мере, может делать) значения, тогда как функция может возвращать только значение (именно поэтому обозначения функций используются в математике, поскольку обычно в одно время обнаруживается только одно значение), хотя некоторые языки программирования не следуют этим правилам, это их истинные определения

0 голосов
/ 21 декабря 2014

Процедуры: 1.Процедуры - это наборы операторов, которые определяют параметризованные вычисления. 2.Процедуры не могут возвращать значения.

3.Процедуры не могут быть вызваны из функции.

Функция 1.Функции структурно напоминают процедуры, но семантически моделируются математическими функциями. 2. Он может возвращать значения 3. Функция может быть вызвана из процедур.

...