Essayons plus simple exemple - juste en calculant le n-ème numéro de Fibonacci.
En premier lieu, la procédure (en 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.
Cet exemple montre les caractéristiques des langages de procédure:
- Il y a quelques sous-routines (fonction dans ce cas)
- Les variables sont de valeur attribuée probablement plusieurs fois (: = opérateur)
- Il y a des cycles (pour opérateur dans ce cas)
- La langue est impératif, à savoir que nous disons ordinateur ce qu'il faut faire dans quel ordre
En second lieu, orienté objet (en 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)
En fait, la le problème ne vaut pas la peine de créer une classe, j'ai donc ajouté la mise en cache des résultats déjà calculés.
Cet exemple montre:
classe
- et son instanciation (par exemple la création)
- classe a sa propre section de mémoire, propre état (auto et ses membres)
- La langue est impératif, à savoir nous disons ordinateur quoi faire dans quel ordre
Non montré mais nous pouvons par exemple Descendez cette classe de la classe abstraite en retournant le nième membre d'une séquence. En subslassing nous obtenons la classe de définition séquence de Fibonacci, séquence 1,2,3 ..., séquence 1,4,9,16, ... etc.
Troisièmement, dans le style fonctionnel (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)
caractéristiques suivantes d'un paradigme de programmation fonctionnelle sont mises en évidence:
- il n'y a pas d'état, pas de variables - seulement des fonctions définies
- il n'y a pas de cycles - ne récursion
- correspondance de modèle: nous avons défini séparément "fib 0", "fib 1" et "fib n" pour le reste des nombres, pas de construction comme si étaient nécessaires
- style déclaratif - nous ne définissons pas l'ordre des étapes à calculer principal valeur de la fonction: le compilateur/interpréteur/runtime le trouve lui-même, compte tenu des définitions de fonctions. Nous disons à l'ordinateur ce que nous voulons obtenir, pas ce qu'il faut faire.
- Évaluation paresseuse. Si main n'appelait que "fib 2" alors "fib n" n'était pas appelé car les fonctions sont évaluées seulement quand leur résultat est nécessaire pour être passé en paramètre à d'autres fonctions.
Mais la principale caractéristique des langages fonctionnels est que les fonctions sont des objets de première classe. Cela peut être démontré par une autre mise en œuvre de fib
:
fib n = fibs!!n
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
nous passons ici la fonction fibs
en tant que paramètre à zipWith
fonction. Cet exemple montre également une évaluation paresseuse: la liste "infini" est calculée uniquement dans la mesure où elle est nécessaire pour d'autres fonctions. Par ailleurs, fonctionnel ne signifie pas nécessairement pas d'objet orienté. Un exemple de langage de programmation à la fois fonctionnel et orienté objet est 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.
Les fonctionnalités suivantes du style de programmation logique peut être vu:
- La langue est déclarative. Comme dans le style fonctionnel, nous définissons les choses et ne disons pas dans quel ordre les faire.
- Mais la différence avec le style fonctionnel est que nous définissons des prédicats, pas des fonctions. Dans ce cas, le fib de prédicat (X, Y) signifie "X-ème nombre de Fibonacci est Y".Étant donné certains prédicats connus (fib (1, 1) et fib (2, 1) - soit le premier nombre de Fibonacci est 1 et le deuxième nombre de Fibonacci est 1) et les règles pour déduire d'autres prédicats (Y est le nombre de Fibonacci est Y est un somme du nombre X-1th Fibonacci et du nombre X-2th Fibonacci), Prolog déduit les prédicats en question. En fait, il pourrait y avoir plus d'une réponse!
- Il n'y a pas de valeurs d'entrée et de valeur de retour - au lieu de cela, nous définissons une relation entre "entrée" et "sortie".
Ce programme pourrait également être utilisé pour savoir ce nombre Fibonacci 8 est à la 6ème place dans la séquence:
?- between(0,inf,X), fib(X,8).
X = 6 .
Hmm. Vous avez accepté ma réponse, puis l'avez refusée et offert une prime. Qu'est-ce qui a changé votre esprit? (Juste curieux, pas trolling pour rep.) –
La plupart des codes sont destinés à démontrer les caractéristiques linguistiques plutôt que le paradigme/méthodologie de la langue. – anonymous