No. Il punto di pseudo-codice è che non deve compilare. Posso velocemente sorvolare su dettagli irrilevanti. Al contrario, anche i linguaggi che assomigliano allo pseudocodice a prima vista possono avere dettagli non intuitivi che limiterebbero l'algoritmo. Prendiamo ad esempio Quicksort in Haskell:
qs :: Ord a => [a] -> [a]
qs [] = []
qs (pivot:xs) = (qs smaller) ++ pivot:(qs larger)
where smaller = [x | x <- xs, x <= pivot]
larger = [x | x <- xs, x > pivot]
o lo stesso in Python:
def qs(array):
if not array:
return []
pivot = array[0]
xs = array[1:]
smaller = [x for x in xs if x <= pivot]
larger = [x for x in xs if x > pivot]
return qs(smaller) + [pivot] + qs(larger)
Il vantaggio in entrambi i casi è che questo è un codice eseguibile, e come tale può essere testato, tipografato e gestito dagli studenti. Tuttavia, entrambi includono dettagli sintattici che distraggono. Gli studenti di solito sono meglio serviti da pseudocodici che illustrano l'intenzione dell'algoritmo, non i dettagli di implementazione:
algorithm QUICKSORT(array)
return [] if array is empty
pivot ← array[0]
xs ← array[1, ...] -- the rest of the array without the pivot
smaller ← [x | x ∈ xs, x <= pivot] -- all smaller or equal elements
larger ← [x | x ∈ xs, x > pivot] -- all larger elements
return [QUICKSORT(smaller)..., pivot, QUICKSORT(larger)...]
Differenze notevoli:
-
Posso semplicemente creare una sintassi di comprensione delle liste che assomiglia alla matematica piuttosto che dover spiegare perché Python ha un for
e if
qui.
-
Non devo spiegare la sintassi di quella lingua per la concatenazione di elenchi. Perché Python usa +
addizione? Cos'è :
in Haskell? Posso semplicemente scegliere una sintassi che ottenga il punto in modo più chiaro.
-
la firma del tipo Ord a => [a] -> [a]
è solo un dettaglio di implementazione. Anche se probabilmente utile in questo caso, le firme del tipo a volte richieste da Haskell possono diventare assurde.
-
Non devo spiegare perché Python considera le raccolte vuote false, e cosa si intende per array[1:]
.
-
Evito gli studenti intelligenti sottolineando che dovrei davvero usare yield
nell'esempio Python.
-
Haskell fa schifo per spiegare strutture dati mutabili come tabelle hash, alberi RB, ....
-
Le cose cominciano a diventare molto specifiche per la lingua una volta che abbiamo bisogno di record complessi per esprimere i nostri algoritmi. Per esempio. Il sistema a oggetti di Python ha alcune sorprese che sono semplicemente fonte di distrazione.
Detto questo, può essere molto utile usare uno di questi linguaggi oltre allo pseudocodice, solo etichettare con attenzione cosa è cosa.