Cum să învețe să scrie algoritmi recursivi - stiva de preaplin în limba rusă

Cum de a dezvolta gândirea recursiv la nivelul la care ar fi ușor pentru a rezolva probleme, cum ar fi retragerea numai acele elemente ale unui arbore binar, care poate fi văzut din partea de sus, iar celălalt este ușor de a scrie algoritmi recursive, cum ar fi programarea dinamica?

Google este doar un nonsens, o explicație primitivă despre „kada Karatch recursiune este funcția se numește)))“. Mai puțin probabil pentru a obține informații cu privire la modul de utilizare stiva atunci când procedura recursiv, dar această cunoaștere nu crește capacitatea de a scrie algoritmi recursive.

Soluțiile de mai multe probleme pe recursie cu hakerranka am venit intuitiv, și vreau să dezvolte capacitatea de a rezolva problema într-un mod conștient de recurență arbitrară. Cum de a realiza acest lucru?

primitiv, prea ușor, și înțelegerea lor nu se dezvoltă capacitatea de a rezolva o sarcină dată recursiv.

Cu toate acestea, inducție matematică nu mă ajută chiar acum pentru a rezolva problema de vedere de sus. Se pare că a existat o lipsă de înțelegere a esenței problemei. Sunt presupunând că consilieri crea iluzia de înțelegere recursivitate, pentru că ei pot scrie de la un fel de memorie de îmbinare. Dar, în orice probleme necunoscute care sunt susceptibile de a fuziona, deoarece ele pot scrie doar o soluție cunoscută pentru a le sarcini. Vreau să învețe cum să rezolve orice problemă și reprezintă recursiv procesul de realizare a unei funcții recursive. - typemoon 04 martie '16 la 13:36

Se poate imagina că o funcție recursivă este deja scris. În rezolvarea problemei să-l folosească așa cum a fost deja scris. După aceea, asigurați-vă că există condiții limită în care se oprește recursivitatea.

De exemplu, să presupunem că avem următoarea problemă: pentru a găsi numărul de moduri posibile de a face schimb de $ 100 de monede de 10 de ruble, 5 ruble, 2 ruble și 1 rublă.

Adică, trebuie să scrie o funcție f (suma nabor_monet), pe care o putem numi ca: rezultat = f (100, [10, 5, 2, 1]). Primul argument - suma pe care trebuie să se schimbe, iar al doilea - o listă a monedelor unice care pot fi utilizate pentru a oferi această sumă.

Imaginați-vă că funcția f a fost deja scris. După cum putem profita acum de ea? Punct-cheie: cred că de o serie de opțiuni de separare, de preferință mod simplu.

De exemplu, rețineți că $ 100 pot fi schimbate cu ajutorul unui monede de zece, cum ar fi și fără utilizarea unei zece monede. Această idee se poate spune că este soluția problemei.

Suma acestor opțiuni va fi egal cu numărul necesar. Apoi, implementarea funcției f poate fi scris ca suma apelurilor recursive în sine a "scurtat" argument: f (90, [1, 2, 5, 10]) + f (100, [1, 2, 5]).

f (90, [1, 2, 5, 10]) - avem un fel de „luat“ monedă din zece-100, dar nu limitează selecția monedelor ulterioare;

f (100, [1, 2, 5]) - nu am luat nimic din suma, dar set limitat de monede.

Ambii termeni sunt numite recursiv. Astfel, se observă că numărul de variante va scadea cu fiecare apel recursiv.

Rămâne să adăugați condițiile limită că funcția nu a fost numit infinit. Pentru a face acest lucru, aveți nevoie pentru a determina dacă există argumente returnează 1, și în ce - 0.

Pentru a rezolva problema (în orice domeniu) necesită cunoștințe și practică.
În acest caz, este necesar să se stăpânească un curs bazat pe algoritmul: citit (sau pentru a asculta) și pentru a rezolva mai multe probleme.

Ca un astfel de curs poate recomanda o carte Sedgwick. Algoritmi în C ++. algoritmi și structuri de date fundamentale. (Deoarece există variante ale acestei cărți pentru C și Java). În ea, în special, există un capitol dedicat recursivitate, și o mulțime de exercițiu.

După ce a învățat elementele de bază ale capacității de a alege o soluție mai optimă vine cu experiență.

Răspuns 4 martie '16 la 14:06

„În acest caz, pe care doriți să stăpânească elementele de bază ale algoritmilor de curs“ Declarația dumneavoastră este incorectă. Am studiat și implementat mulți algoritmi pot scrie câteva tipuri de arbori de memorie, sortarea, sistem de subseturi disjuncte, sqrt-descompunere, etc., și vedere de sus nu se poate rezolva. - typemoon 04 martie '16 la 14:09

@typemoon - Nu-ți face griji. Această sarcină bine definită. - Igor 04 martie '16 la 14:11

Nu, esența problemei este clar, dar cum să utilizați recursivitate aici - este neclar. Unele dintre concluziile mele nu fac ceea ce ai nevoie, sau de ieșire toate elementele copacului. - typemoon 04 martie '16 la 14:14

Avem nevoie de doua functii recursive diferite. - una pentru partea stângă a copacului, celălalt - spre dreapta. Acestea vor fi diferite numai în locul în care valoarea de ieșire de sus. Într-un caz se va imprima după apel recursiv, altul -. - zverkov 04 martie '16 la 14:19