1 / 7

eliminare la ricorsione

eliminare la ricorsione. ovvero gestire direttamente la pila. perché la ricorsione?. strumento potente per descrivere/progettare algoritmi idea fondamentale: risolvere un problema di "taglia" (dimensione dell'input) n sfruttando le soluzioni di uno o più problemi simili ma di taglia m < n

tevin
Télécharger la présentation

eliminare la ricorsione

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. eliminare la ricorsione ovvero gestire direttamente la pila

  2. perché la ricorsione? • strumento potente per descrivere/progettare algoritmi • idea fondamentale: risolvere un problema di "taglia" (dimensione dell'input) n sfruttando le soluzioni di uno o più problemi simili ma di taglia m < n • spesso risulta m = n - 1 ASD - eliminare la ricorsione

  3. a b c d e f g analizziamo un algoritmo ricorsivo void treePreorder(root) { if(root == null) return; <visita root> r = root.firstChild while (r != null) { treePreorder(r); r = r.nextSibling; } } 1 4 2 7 3 5 6 ASD - eliminare la ricorsione

  4. analisi esecuzione a void treePreorder(root) { if(root == null) return; <visita root> r = root.firstChild while (r != null) { treePreorder(r); r = r.nextSibling; } } b c d e f g root = e r = null root = f r = null root = g r = null root = b r = e root = b r = null root = c r = f root = c r = g root = c r = null root = d r = null Pila dei record di attivazione root = a r = b root = a r = b root = a r = c root = a r = c root = a r = c root = a r = d root = a r = null ASD - eliminare la ricorsione

  5. gestione esplicita della pila void iterativeTreePreorder(root) { if(root == null) return; pila.push(root); while(!pila.isEmpty()) { v = pila.pop(); <visita v> if(v.nextSibling != null) pila.push(v.nextSibling); if(v.firstChild != null) pila.push(v.firstChild); } } ASD - eliminare la ricorsione

  6. esecuzione iterativa void iterativeTreePreorder(root) { if(root == null) return; pila.push(root); while(!pila.isEmpty()) { v = pila.pop(); <visita v> if(v.nextSibling != null) pila.push(v.nextSibling); if(v.firstChild != null) pila.push(v.firstChild); } } a b c d e f g e c f d g d a b c d stato pila inizio corpo while ASD - eliminare la ricorsione

  7. ricorsione vs. iterazione • vantaggi ricorsione • intuitiva ed elegante • semplifica la costruzione di algoritmi • vantaggi iterazione • non ci sono "costi nascosti" • pila gestita esplicitamente, più efficientemente rispetto alla pila dei record di attivazione del supporto runtime ASD - eliminare la ricorsione

More Related