Saya keberatan dengan sesuatu yang terus saya lihat berulang-ulang di sebagian besar jawaban ini, bahwa apa yang membuat fungsi berfungsi adalah mengembalikan nilai.
Fungsi bukan sembarang metode lama yang mengembalikan nilai. Tidak demikian: Agar suatu metode menjadi fungsi nyata, ia harus mengembalikan nilai yang sama selalu diberikan input tertentu. Contoh dari metode yang bukan fungsi adalahrandom
metode di sebagian besar bahasa, karena meskipun mengembalikan nilai, nilainya tidak selalu sama.
Oleh karena itu fungsi lebih mirip dengan peta (misalnya di mana x -> x'
untuk fungsi satu dimensi). Ini adalah perbedaan yang sangat penting antara metode dan fungsi reguler karena ketika berhadapan dengan fungsi nyata waktu dan urutan di mana mereka dievaluasi seharusnya tidak pernah menjadi masalah di mana karena ini tidak selalu terjadi dengan non fungsi.
Berikut adalah contoh lain dari metode yang bukan fungsi tetapi akan tetap mengembalikan nilai.
// The following is pseudo code:
g(x) = {
if (morning()) {
g = 2 * x;
}
else {
g = x;
}
return g;
}
Saya lebih jauh menolak gagasan bahwa prosedur tidak mengembalikan nilai. Suatu prosedur hanyalah cara spesifik untuk membicarakan suatu fungsi atau metode. Jadi itu berarti jika metode yang mendasari bahwa prosedur Anda mendefinisikan atau mengimplementasikan mengembalikan nilai, coba tebak apa prosedur yang mengembalikan nilai. Ambil contoh cuplikan berikut dari 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))))))
Pernahkah Anda mendengar tentang prosedur rekursif akhir-akhir ini? Mereka berbicara tentang fungsi rekursif (fungsi nyata) dan mengembalikan nilai dan mereka menggunakan kata "prosedur". Jadi apa bedanya, kalau begitu?
Nah cara lain untuk memikirkan suatu fungsi (selain makna yang disebutkan di atas) adalah sebagai representasi abstrak dari cita-cita seperti angka 1. Suatu prosedur adalah implementasi aktual dari hal itu. Saya pribadi berpikir mereka dapat dipertukarkan.
(Catatan, jika Anda membaca bab itu dari tautan yang saya berikan, Anda mungkin menemukan bahwa konsep yang lebih sulit untuk dipahami bukan perbedaan antara fungsi dan prosedur, tetapi proses dan prosedur. Apakah Anda tahu bahwa prosedur rekursif dapat memiliki proses berulang?)
Analog untuk prosedur adalah resep. Sebagai contoh; misalkan Anda memiliki mesin bernama mesin make-pies
ini mengambil bahan (fruit, milk, flower, eggs, sugar, heat)
dan mesin ini mengembalikan a pie
.
Representasi mesin ini mungkin terlihat seperti
make-pies (fruit, milk, flower, eggs, sugar, heat) = {
return (heat (add fruit (mix eggs flower milk)))
}
Tentu saja itu bukan satu-satunya cara untuk membuat kue.
Dalam hal ini kita dapat melihat bahwa:
A function is to a machine
as a procedure is to a recipe
as attributes are to ingredients
as output is to product
Analogi itu baik-baik saja tetapi rusak ketika Anda mempertimbangkan bahwa ketika Anda berurusan dengan program komputer semuanya adalah abstraksi. Jadi tidak seperti dalam hal resep untuk mesin kami membandingkan dua hal yang merupakan abstraksi sendiri; dua hal yang mungkin juga merupakan hal yang sama. Dan saya berpendapat bahwa mereka (untuk semua maksud dan tujuan) adalah hal yang sama.