Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Incalzire cu Boiler cu PDC + IPAT...

Salariu de șofer Uber 8000 l...

Problema token semnatura electron...

Incarcator diy China
 Unde au disparut tancurile federa...

RMN Decontat

Jgheab clasic forma "U"- ...

Reparatie plafoniera LED
 Problema PC - se blocheaza sau re...

Notebook HP 840G2 - Upgrade RAM, ...

Defect ciudat Videorecorder Panas...

lege de reglementare a shrinkflat...
 Care este cota parte la succesiun...

Camera auto DVR PNI Voyager S2600...

Cartelul din Carpati - mafia PNL ...

Trecut: Europa versus S.U.A. la c...
 

Algoritmi recursivi vs iterativi

- - - - -
  • Please log in to reply
40 replies to this topic

#1
reaper666

reaper666

    Junior Member

  • Grup: Members
  • Posts: 157
  • Înscris: 31.01.2012
Recent am inceput sa rezolvam probleme la info, folosind algoritmi recursivi. Sunt multe probleme pe care pot sa le rezolv iterativ in 2 minute, dar pur si simplu nu imi dau seama cum ar trebui sa fac algoritmul recursiv. Exista vreun avantaj al algoritmilor recursivi, sau alegerea modului de rezolvare depinde doar de "gusturile" programatorului?

Edited by reaper666, 14 March 2013 - 16:38.


#2
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,632
  • Înscris: 30.07.2003
Scrie o "cautare binara/divide et impera" recursiv si vezi cum arata.

#3
jm2010

jm2010

    Senior Member

  • Grup: Senior Members
  • Posts: 5,011
  • Înscris: 14.03.2013

 reaper666, on 14 martie 2013 - 16:37, said:

Recent am inceput sa rezolvam probleme la info, folosind algoritmi recursivi. Sunt multe probleme pe care pot sa le rezolv iterativ in 2 minute, dar pur si simplu nu imi dau seama cum ar trebui sa fac algoritmul recursiv. Exista vreun avantaj al algoritmilor recursivi, sau alegerea modului de rezolvare depinde doar de "gusturile" programatorului?

Codul recursiv ii cod mai curat, mai elegant, de multe ori mai usor de inteles etc. dar depinde de situatie deoarece (o problema importanta) nu poti apela recursiv o functie la infinit fiindca orice apel al functiei salveaza in stiva starea si cum stiva nu este infinita, la un moment dat programul iti va crapa cu stackoverflow.

#4
nucL3ar

nucL3ar

    Junior Member

  • Grup: Members
  • Posts: 45
  • Înscris: 23.08.2009

 jm2010, on 14 martie 2013 - 16:47, said:

Codul recursiv ii cod mai curat, mai elegant, de multe ori mai usor de inteles

Aici tind sa te contrazic. Algoritmii recursivi sunt de obicei mai eleganti (daca prin elengant vrei sa zici mai compacti), dar mai curat sau usor de inteles n-as crede.

Iterativ, parerea mea, e mai usor de inteles aproape orice algoritm, dar e mai greu de scris.

#5
Pac_Man

Pac_Man

    Senior Member

  • Grup: Senior Members
  • Posts: 2,258
  • Înscris: 10.12.2001
Ne poti arata o varianta iterativa mai "usor de inteles" decat cea recursiva pentru listarea unei structuri de directoare?

#6
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,632
  • Înscris: 30.07.2003

 nucL3ar, on 14 martie 2013 - 16:55, said:

Aici tind sa te contrazic.
Statistic nu ai dreptate. Dar particular la modul tau de a percepe ai, nimeni nu poate sa contrazica simturile tale.

Edited by neagu_laurentiu, 14 March 2013 - 17:06.


#7
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 reaper666, on 14 martie 2013 - 16:37, said:

Exista vreun avantaj al algoritmilor recursivi, sau alegerea modului de rezolvare depinde doar de "gusturile" programatorului?
Avantaje algoritmi recursivi:
- sunt mai simpli de scris, dacă ai înţeles problema (recursivă), sau datele (recursive, izomorfe)
- ca elev, te fac să gândeşti altfel
- poţi oricând să-i "linearizezi", deci arunci la grămadă un algoritm recursiv în faza de prototyping, şi mult mai încolo te poţi gândi la eficientizare

Avantaje algoritmi iterativi:
- mai performanţi, nu încarcă stiva, nu pierzi controlul asupra memoriei (în special a fragmentării). O stivă consumată e un pericol real în orice program mai complex care foloseşte algoritmi recursivi

Notă: numărul de avantaje e irelevant, şi probabil mai lipsesc alte avantaje din acest tabel.

#8
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
Singurul avantaj al algoritmilor recursivi apare in momentul in care nu poti rezolva problema altfel (iterativ), sau ar fi prea dificil.
De exemplu, e absurd sa calculezi recursiv factorialul unui numar; dar problema turnurilor din Hanoi are sens.

#9
jm2010

jm2010

    Senior Member

  • Grup: Senior Members
  • Posts: 5,011
  • Înscris: 14.03.2013

 TS030, on 14 martie 2013 - 22:19, said:

Singurul avantaj al algoritmilor recursivi apare in momentul in care nu poti rezolva problema altfel (iterativ), sau ar fi prea dificil.
De exemplu, e absurd sa calculezi recursiv factorialul unui numar; dar problema turnurilor din Hanoi are sens.

Depinde de problema. Adevarul este ca pentru un incepator in programare, algoritmii recursivi par foarte greu de inteles si de cele mai multe ori prefera algoritmii iterativi. Un programator cu experienta va prefera cam intotdeauna algoritmii recursivi in locul celor iterativi atunci cand se pot folosi ambele variante. Dar depinde de tipul problemei si depinde de nivelul de experienta.

#10
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012

 jm2010, on 15 martie 2013 - 08:43, said:

Un programator cu experienta va prefera cam intotdeauna algoritmii recursivi in locul celor iterativi atunci cand se pot folosi ambele variante.
Nu stiu ce fel de programator cu experienta e ala, dar eu l-as da afara.

#11
jm2010

jm2010

    Senior Member

  • Grup: Senior Members
  • Posts: 5,011
  • Înscris: 14.03.2013

 TS030, on 15 martie 2013 - 10:09, said:

Nu stiu ce fel de programator cu experienta e ala, dar eu l-as da afara.

Hmmm, un programator care nu s-ar obosi sa lucreze pentru tine. Si eu m-am referit la programatori cu experienta adevarat nu la cei la care experienta relevanta se masoara doar in anii in care a stat la aceeasi firma.
P.S. Un programator cu experienta isi alege firma unde lucreza nu invers.

Edited by jm2010, 15 March 2013 - 10:17.


#12
wirespot

wirespot

    Senior Member

  • Grup: Senior Members
  • Posts: 6,654
  • Înscris: 23.09.2002

 reaper666, on 14 martie 2013 - 16:37, said:

Exista vreun avantaj al algoritmilor recursivi, sau alegerea modului de rezolvare depinde doar de "gusturile" programatorului?

Principalul considerent ar trebui să fie complexitatea algoritmului, sau mai simplu spus, efortul, numărul de paşi necesari pentru găsirea soluţiei. Nu e de neglijat nici estimarea resurselor necesare, poate una dintre abordări funcţionează cu resurse mult mai mici. Uneori ai cazuri în care un algoritm e mai rapid dar consumă mai multe resurse şi atunci trebuie să alegi ce preferi, să meargă mai repede sau să consume mai puţin.

Depinde şi de limbajul de programare, unele limbaje pot oferi facilităţi care să te facă să înclini în mod natural spre o soluţie sau alta.

Un exemplu bun este parcurgerea documentelor XML. Există metode care încarcă tot documentul în memorie şi poţi ajunge "manual" şi foarte rapid la orice nod dacă-i ştii locaţia ierarhică, face căutări etc. Dar consumă multă memorie. Sau poţi folosi metode care nu reţin nimic în memorie, se apelează recursiv pentru fiecare nod sau nivel ierarhic din structura XML, şi ca să găseşti un nod de un anumit tip sau anumită locaţie trebuie să "interceptezi" condiţional procesarea când ajunge la anumite puncte.

 TS030, on 14 martie 2013 - 22:19, said:

De exemplu, e absurd sa calculezi recursiv factorialul unui numar; dar problema turnurilor din Hanoi are sens.
Depinde de modul în care gândeşti soluţia. Poţi spune "hai să înmulţim toate numerele între 1 şi n", sau poţi spune "n! = n x (n-1)!" Ambele sunt moduri perfect acceptabile de a vedea lucrurile.

 Pac_Man, on 14 martie 2013 - 16:58, said:

Ne poti arata o varianta iterativa mai "usor de inteles" decat cea recursiva pentru listarea unei structuri de directoare?

Poţi adăuga directoarele într-o listă şi să o parcurgi liniar. Începi cu lista conţinând doar directorul de start, iar fiecare iteraţie va consta din:
* afişarea fişierelor şi directoarelor din directorul aferent intrării curente
* inserarea directoarelor găsite în listă, imediat după intrarea curentă dar înainte de alte intrări
* avansare la următoarea intrare

Edited by wirespot, 15 March 2013 - 10:29.


#13
jm2010

jm2010

    Senior Member

  • Grup: Senior Members
  • Posts: 5,011
  • Înscris: 14.03.2013

 wirespot, on 15 martie 2013 - 10:23, said:

Poţi adăuga directoarele într-o listă şi să o parcurgi liniar. Începi cu lista conţinând doar directorul de start, iar fiecare iteraţie va consta din:
* afişarea fişierelor şi directoarelor din directorul aferent intrării curente
* inserarea directoarelor găsite în listă, imediat după intrarea curentă dar înainte de alte intrări
* avansare la următoarea intrare
Da, dar este mai ineficient (cod redundant).

Edited by jm2010, 15 March 2013 - 10:28.


#14
wirespot

wirespot

    Senior Member

  • Grup: Senior Members
  • Posts: 6,654
  • Înscris: 23.09.2002
Ce anume este redundant în algoritm?

Este mai costisitor pentru că apar în plus operaţiuni de menţinere a listei şi inserarea în ea, de acord (presupunând că nu cumva costul de apelare al unei funcţii e mai mare sau echivalent).

Dar pe de altă parte nu mai sunt limitat pe adâncime de stivă ci de memoria principală, care-i mult mai mare. La un algoritm recursiv adâncimea maximă e deseori un punct vulnerabil.

Să zicem că ai un manager de fişiere şi vrei să oferi clientului o listare arborescentă sau o căutare pe numele fişierelor şi directoarelor. Vei prefera implementarea un pic mai rapidă dar care are şanse mai mari să crape la o anumită adâncime, sau una un pic mai lentă care e puţin probabil să dea de limitări de memorie?

Edited by wirespot, 15 March 2013 - 10:48.


#15
jm2010

jm2010

    Senior Member

  • Grup: Senior Members
  • Posts: 5,011
  • Înscris: 14.03.2013

 jm2010, on 15 martie 2013 - 08:43, said:

Depinde de problema. Adevarul este ca pentru un incepator in programare, algoritmii recursivi par foarte greu de inteles si de cele mai multe ori prefera algoritmii iterativi. Un programator cu experienta va prefera cam intotdeauna algoritmii recursivi in locul celor iterativi atunci cand se pot folosi ambele variante. Dar depinde de tipul problemei si depinde de nivelul de experienta.
A fost un exemplu. Am subliniat ceea ce deja am spus mai sus. Atunci cand adancimea nu este limitata (sa o poti controla spre exemplu) atunci nu folosesti recursivitatea (asa cum am bold-uit mai sus). In functie de caz dar, daca poti folosi ambele variante (solutia iti permite), recursivitatea este mai eficienta (si iterativ, in afara cazului in care vrei sa pui tot codul in aceeasi metoda si astfel ai redundata - mai greu de intretinut - tot vei folosi apeluri de functii, deci nici viteza nu iti va fi influenta prea mult de iterativitate vs recursivitate).

P.S. Sunt solutii recursive si pentru cazul directoarelor. Sunt solutii sa eviti problema stack-ului in cazul afisarii directoarelor dintr-un sistem. Nu este chiar un exemplu relevant.

Edited by jm2010, 15 March 2013 - 10:53.


#16
Dorin_78

Dorin_78

    Member

  • Grup: Members
  • Posts: 323
  • Înscris: 09.02.2013
la viteza recursivul e mai slab, apelul acela de functie(saltul) e costisitor ca timp

singurul avantaj major pe care-l vad eu in recursivitate e diminuarea nr. de linii

dar nu e practică recursivitatea, daca scrii o functie recursiva si apoi(dupa o luna de exemplu) trebuie sa revii asupra ei sa o modifici e posibil sa dai de draq. pe cand una iterativa o modifici usor.

recursivitatea cere si mai multa intelegere. pt mine e un semn de pricepere daca reusesti sa transformi usor si eficient din iterativ in recursiv.

Edited by Dorin_78, 15 March 2013 - 11:10.


#17
jm2010

jm2010

    Senior Member

  • Grup: Senior Members
  • Posts: 5,011
  • Înscris: 14.03.2013

 Dorin_78, on 15 martie 2013 - 10:57, said:

la viteza recursivul e mai slab, apelul acela de functie(saltul) e costisitor ca timp

Corect dar, asa cum spuneam, depinde de problema. In unele cazuri poate deveni costisitor in altele nu (nu ma refer aici o o metoda cu 5 linii in care doar se citeste o variabila ci la chestii serioase cum te intalnesti in practica).

#18
wirespot

wirespot

    Senior Member

  • Grup: Senior Members
  • Posts: 6,654
  • Înscris: 23.09.2002
Nu cred că e posibil să generalizezi şi să decizi că recursivitatea e mereu mai eficientă. Ce înseamnă "eficient" depinde de la caz la caz, de mulţi factori.

Quote

daca poti folosi ambele variante

De folosit probabil poţi folosi orice abordare în orice problemă. Poţi forţa soluţii recursive sau iterative în cazuri în care cealaltă abordare ar fi fost mai naturală sau mai eficientă.

Dar ce e "natural" e subiectiv, ţine de limitele de experienţă şi imaginaţie şi flexibilitatea mentală a programatorului. Iar ce e "eficient" depinde de arhitectura sistemului, de limbaj, de resursele disponibile etc.

Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate