In generale, la programmazione dichiarativa si preoccupa di dire al computer cosa fare. La programmazione imperativa si preoccupa di dire al computer come farlo. Qualsiasi programma non banale conterrà necessariamente entrambi.
La programmazione imperativa è in genere associata al flusso di controllo, ai loop e allo stato mutabile. I programmi scritti nel paradigma procedurale sono tipicamente imperativi, anche se non necessariamente devono esserlo; puoi scrivere funzioni in un linguaggio procedurale che funziona più o meno nello stesso modo in cui lo fanno in un linguaggio funzionale.
La programmazione imperativa inizia al livello della lingua della macchina, dove loop, salti e stato sono comuni. Da lì, è possibile creare astrazioni più elevate scrivendo linguaggi di programmazione, partendo dal linguaggio assembly (che, per la maggior parte, esegue il mapping alle istruzioni del processore). Puoi progredire in un linguaggio procedurale come C, renderlo orientato agli oggetti (C con le classi), aggiungere molta più sofisticatezza (C ++), e comunque essere ancora trincerato nella programmazione imperativa per la maggior parte.
La programmazione dichiarativa è caratterizzata più da dichiarazioni che da istruzioni. Comprende linguaggi specifici del dominio come SQL, linguaggi funzionali come Haskell e strutture di dati dichiarative come XML. I linguaggi di programmazione puramente funzionali dispensano dallo stato mutabile, preferendo memorizzare lo stato negli spazi tra le chiamate di funzione, piuttosto che come membri privati di una classe. Puoi scrivere codice puramente funzionale in un linguaggio imperativo / OO, come dimostra Linq.
Il motivo per cui vedi ricorsività molto nei linguaggi puramente funzionali è perché quelle lingue rinunciano anche ai cicli . senza un ciclo (un costrutto che è fondato specificatamente nel come ), si deve ricorrere alla ricorsione per ottenere un comportamento simile a un loop. Come hai già scoperto, molti problemi possono essere espressi naturalmente usando la ricorsione, una volta compreso.
La cosa importante da ricordare sul pensare in modo dichiarativo è che è solo un altro livello di astrazione. I tuoi studenti dovrebbero pensare a risolvere i problemi in modo dichiarativo? Assolutamente, ma devono anche essere in grado di dire al computer come per risolvere il problema, non solo cosa.
Non è un caso che i linguaggi di programmazione considerati più pratici e pratici dai loro praticanti siano quelli in cui è possibile scrivere codice sia in stile dichiarativo che imperativo.
Ulteriori letture
Programmazione imperativa
Programmazione dichiarativa