Proviamo più semplice esempio: basta calcolare il n-esimo numero di Fibonacci.
In primo luogo, procedurale (in 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.
Questo esempio mostra caratteristiche di linguaggi procedurali:
- Ci sono alcune subroutine (funzione in questo caso)
- variabili vengono assegnati valore probabilmente più volte (: = operatore)
- Ci sono cicli (per operatore in questo caso)
- lingua è indispensabile, cioè stiamo dicendo computer cosa fare in quale ordine
In secondo luogo, orientata agli oggetti (in 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)
In realtà la problema non vale la pena creare una classe, quindi ho aggiunto il caching dei risultati già calcolati.
Questo esempio mostra:
- classe e della relativa istanziazione (esempio creando)
- classe ha propria sezione di memoria, proprio stato (sé ed i suoi membri)
- linguaggio è imperativo, cioè stiamo dicendo al computer cosa fare in quale ordine
Non mostrato ma possiamo ad es. discendi questa classe dalla classe astratta che restituisce l'n-esimo membro di qualche sequenza. Con subslassing otteniamo classe che definisce la sequenza di Fibonacci, la sequenza 1,2,3 ..., sequenza 1,4,9,16, ... ecc
In terzo luogo, in stile funzionale (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)
Le seguenti caratteristiche di un paradigma di programmazione funzionale sono dimostrate:
- non c'è stato, nessuna variabile - solo funzioni definite
- ci sono cicli - solo ricorsione
- corrispondenza del modello: abbiamo definito separatamente "fib 0", "fib 1" e "fib n" per il resto dei numeri, nessun costrutto come se fosse necessario
- stile dichiarativo - non definiamo l'ordine dei passaggi per calcolare valore di funzione principale: il compilatore/interprete/runtime lo rileva da solo, date le definizioni di funzione. Diciamo al computer cosa vogliamo ottenere, non cosa fare.
- Valutazione pigra. Se main chiamava solo "fib 2", allora "fib n" non veniva chiamato perché le funzioni sono valutate solo quando il loro risultato è necessario per essere passato come parametro ad altre funzioni.
Ma la caratteristica principale dei linguaggi funzionali è che le funzioni sono oggetti di prima classe. Questo può essere dimostrato con altre applicazioni di fib
:
fib n = fibs!!n
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Qui stiamo passando fibs
funzione del parametro di zipWith
funzione. Questo esempio dimostra anche una valutazione lazy: la lista "infinita" viene calcolata solo per estenderne l'uso per altre funzioni.
A proposito, funzionale non necessario significa non orientato agli oggetti. Un esempio di linguaggio di programmazione che sia funzionale e orientato agli oggetti è 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.
seguenti funzionalità di stile di programmazione logica può essere visto:
- lingua è dichiarativa. Come nello stile funzionale, definiamo le cose e non diciamo in quale ordine eseguirle.
- Ma la differenza con lo stile funzionale è che definiamo i predicati, non le funzioni. In questo caso, il predicato fib (X, Y) significa "X-esimo numero di Fibonacci è Y".Dati alcuni predicati noti (fib (1, 1) e fib (2, 1) - ovvero il primo numero di Fibonacci è 1 e il secondo numero di Fibonacci è 1) e regole per inferire altri predicati (Y è X-th Il numero di Fibonacci è Y è un somma del numero X-1 ° di Fibonacci e del numero X-2 ° di Fibonacci), il Prolog fornisce i predicati in questione. In realtà ci potrebbe essere più di 1 risposta!
- Non ci sono valori di input e valori di ritorno - al posto di questo definiamo una relazione tra "input" e "output".
Questo programma potrebbe anche essere utilizzato per scoprire che Fibonacci numero 8 è al 6 ° posizione nella sequenza:
?- between(0,inf,X), fib(X,8).
X = 6 .
Hmm. Hai accettato la mia risposta, poi non l'hai accettata e hai offerto una taglia. Cosa ti ha fatto cambiare idea? (Solo curioso, non trolling per rappresentante.) –
La maggior parte dei codici è intesa a dimostrare le caratteristiche del linguaggio piuttosto che il Paradigma/Metodologia della lingua. – anonymous