La ricorsione è un approccio dichiarativo per risolvere i problemi?

0

Ho notato che molti problemi nel manuale degli algoritmi sono risolti dalla ricorsione (divide e conquista, backtracking, ...)

Come ho cercato di migliorare le mie capacità di scriverle, ho notato, ho solo bisogno di tradurre una definizione ricorsiva del problema nel codice. Quindi non ho nemmeno bisogno di sapere come verrà eseguito. Pensavo che la ricorsione potesse naturalmente appartenere alla programmazione funzionale.

In realtà io sono nuovo alla programmazione funzionale o dichiarativa (stavo solo studiando alcuni su di loro). E 'un buon consiglio per gli studenti di pensare in modo dichiarativo (pensa di mettere in relazione le definizioni piuttosto come) quando vogliono scrivere un algoritmo ricorsivo? Potrebbe essere una regola generale per qualsiasi algoritmo ricorsivo?

Inoltre, qual è esattamente l'approccio dichiarativo per risolvere un problema (come nella programmazione funzionale)?

    
posta Ahmad 16.02.2015 - 20:53
fonte

2 risposte

5

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

    
risposta data 16.02.2015 - 21:57
fonte
0

Penso che le funzioni ricorsive appartengano al paradigma dichiarativo:

  • Definisci la base: Factorial(1) = 1;
  • Definisci fattoriale n : Factorial(n) = n* Factorial(n-1);

Tuttavia, qualsiasi funzione ricorsiva non dovrebbe essere una funzione dichiarativa completa. È possibile definire la base e collegare (definire) la soluzione del problema principale alla soluzione (definizione) dei sotto-problemi. Ma per questa relazione potresti aver bisogno di una procedura (procedura imperativa)

Ad esempio, considera merge sort:

  • Definisci la base: One element is already sorted
  • Definisci Sort (l,h) : m=(l+h)/2; sub1=Sort(l,m); sub2=Sort(m+1,h); return merge(sub1,sub2);

In questa definizione, merge potrebbe essere una procedura imperativa per mettere in relazione la definizione o la soluzione di ordinare l'intero array al tipo di sotto-array.

    
risposta data 17.02.2015 - 12:23
fonte

Leggi altre domande sui tag