Chúng ta hãy thử đơn giản hơn ví dụ - chỉ tính số Fibonacci n-th.
Thứ nhất, thủ tục (trong Pascal):
program Fibonacci;
function fib(n: Integer): Integer;
var a: Integer = 1;
b: Integer = 1;
f: Integer;
i: Integer;
begin
if (n = 1) or (n = 2) then
fib := 1
else
begin
for i := 3 to n do
begin
f := a + b;
b := a;
a := f;
end;
fib := f;
end;
end;
begin
WriteLn(fib(6));
end.
Ví dụ này cho thấy tính năng của ngôn ngữ thủ tục:
- Có một số chương trình con (hàm trong trường hợp này)
- biến được gán giá trị có thể nhiều lần (: = nhà điều hành)
- Có chu kỳ (cho nhà điều hành trong trường hợp này)
- Ngôn ngữ là bắt buộc, tức là chúng ta đang nói với máy tính phải làm gì để những gì
Thứ hai, đối tượng định hướng (bằng Python):
class Fibonacci:
def __init__(self):
self.cache = {}
def fib(self, n):
if self.cache.has_key(n):
return self.cache[n]
if n == 1 or n == 2:
return 1
else:
a = 1
b = 1
for i in range(2, n):
f = a + b;
b = a;
a = f;
self.cache[n] = f;
return f;
fibonaccyCounter = Fibonacci()
print fibonaccyCounter.fib(6)
Trên thực tế các vấn đề không đáng để tạo một lớp, vì vậy tôi đã thêm bộ nhớ đệm của các kết quả đã được tính toán.
Ví dụ này cho thấy:
- lớp và instantiation (tạo chẳng hạn) nó
- lớp đã phần bộ nhớ, tiểu bang riêng (tự và các thành viên của nó)
- Ngôn ngữ là bắt buộc, tức là sở hữu chúng tôi đang nói với máy tính phải làm gì theo thứ tự nào
Không được hiển thị nhưng chúng tôi có thể ví dụ xuống lớp này từ lớp trừu tượng trả về thành viên thứ n của một số chuỗi. Bởi subslassing chúng tôi nhận lớp xác định dãy Fibonacci, dãy 1,2,3 ..., chuỗi 1,4,9,16, ... vv
Thứ ba, trong phong cách chức năng (Haskell):
import Text.Printf
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
main = printf "%d\n" (fib 6)
tính năng sau của một mô hình lập trình chức năng được thể hiện:
- không có nhà nước, không có biến - chỉ cần chức năng xác định
- không có chu kỳ - chỉ đệ quy
- đối sánh mẫu: chúng tôi đã xác định riêng "fib 0", "fib 1" và "fib n" đối với các số còn lại, không có cấu trúc nào như nếu là cần thiết
- kiểu khai báo - chúng tôi không xác định thứ tự các bước cần tính chính giá trị hàm: trình biên dịch/thông dịch viên/thời gian chạy con số này ra bởi chính nó, cho các định nghĩa chức năng. Chúng tôi nói với máy tính những gì chúng tôi muốn nhận được, không phải làm gì.
- Đánh giá lười biếng. Nếu chính được gọi là "fib 2" thì "fib n" không được gọi vì các hàm chỉ được đánh giá khi kết quả của chúng là cần thiết để được chuyển thành tham số cho các hàm khác.
Nhưng tính năng chính của ngôn ngữ chức năng là các hàm là đối tượng lớp đầu tiên. Điều này có thể được chứng minh bằng thực hiện khác của fib
:
fib n = fibs!!n
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Ở đây chúng ta đang đi qua fibs
chức năng như tham số để zipWith
chức năng. Ví dụ này cũng thể hiện đánh giá lười biếng: danh sách "vô hạn" chỉ được tính đến mức cần thiết cho các chức năng khác.
Nhân tiện, chức năng không cần thiết có nghĩa là không hướng đối tượng. Một ví dụ về ngôn ngữ lập trình có cả chức năng và hướng đối tượng là Scala.
Prolog:
fib(1, 1).
fib(2, 1).
fib(X, Y):-
X > 1,
X1 is X - 1,
X2 is X - 2,
fib(X1, Z),
fib(X2, W),
Y is W + Z.
main :-
fib(6,X), write(X), nl.
Tiếp theo đặc điểm của phong cách lập trình logic có thể được nhìn thấy:
- Ngôn ngữ là tường thuật. Như trong phong cách chức năng, chúng ta định nghĩa mọi thứ và không nói ra thứ tự để làm chúng.
- Nhưng sự khác biệt với kiểu chức năng là chúng ta định nghĩa các biến vị ngữ, chứ không phải các hàm. Trong trường hợp này, biến vị ngữ fib (X, Y) có nghĩa là "số Fibonacci X là Y".Cho một số vị ngữ đã biết (fib (1, 1) và fib (2, 1) - tức là số Fibonacci đầu tiên là 1 và số Fibonacci thứ hai là 1) và các quy tắc suy ra các biến vị ngữ khác (Y là số Fibonacci X-thứ Y là một tổng số Fibonacci X-1 và số Fibonacci X-2), Prolog sẽ làm cho các vị từ được đề cập đến. Trên thực tế có thể có nhiều hơn 1 câu trả lời!
- Không có giá trị đầu vào và giá trị trả về - thay vì điều này, chúng tôi xác định mối quan hệ giữa "đầu vào" và "đầu ra".
Chương trình này cũng có thể được sử dụng để tìm ra rằng Fibonacci số 8 là ở vị trí thứ 6 trong chuỗi:
?- between(0,inf,X), fib(X,8).
X = 6 .
Hmm. Bạn chấp nhận câu trả lời của tôi, sau đó không chấp nhận nó và cung cấp một tiền thưởng. Điều gì đã thay đổi suy nghĩ của bạn? (Chỉ cần tò mò, không trolling cho đại diện.) –
Hầu hết các mã được dự định để chứng minh các tính năng ngôn ngữ chứ không phải là Paradigm/Phương pháp luận của ngôn ngữ. – anonymous