Salt la conținut

SUBIECTE NOI
« 1 / 5 »
RSS
Foisor - noi reglementari

Recomandare telefon preț 300...

La Multi ani de ziua noastra a tu...

EURO 24 - Primul meci: Romania - ...
 Bicicleta eliptica

Aer conditionat Vortex 9000/12000...

Curatare tigaie

Alegere SPC sau parchet laminat -...
 Sfat achizitie masina SH

Foloseste cineva radar?

Extreme cuponing este adevarata e...

Cum de le convine unora sa cumper...
 Vanzatorul mașinii a plecat ...

RCA majorat in Bucuresti si Ilfov

OMV Petrom cumpara Renovatio

Sens unic pe strada Matasari (Buc...
 

Algoritmi recursivi vs iterativi

- - - - -
  • Vă rugăm să vă autentificați pentru a răspunde
40 răspunsuri în acest subiect

#37
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Mesaje: 15.193
  • Înscris: 25.06.2012

 OriginalCopy, on 16 martie 2013 - 15:13, said:

Asta şi spuneam. Îl faci recursiv, deci uşor de înţeles, şi ăhăăă la sfârşit de tot, şi doar dacă în urma profilingului apare acel algoritm printre probleme, te apuci să-l optimizezi, transformându-l în iterativ greu de mentenat.
Vorbesti de un caz particular, in care varianta recursiva e usor de inteles si una iterativa nu? Caci codul iterativ nu este in mod necesar dificil de inteles.
Cu abordarea sunt de acord, optimizarile "la sange" nu le faci doar ca ti se pare tie c-ar fi fain; trebuie sa stii ce sa optimizezi. As avea doua precizari suplimentare:
- e bine sa eviti din start solutiile clar ineficiente, asta daca nu cumva ai un motiv anume. Nu vorbesc de optimizari costisitoare, ci chestii de genul "ce sens are sa calculez recursiv un factorial", sau "de ce tot realoc memorie in rutina asta care e mereu apelata, cand se poate si altfel".
- chiar cand optimizezi un algoritm, e bine sa incerci sa scrii cod clar, cat mai usor de inteles.

#38
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Mesaje: 27.268
  • Înscris: 10.08.2006
Mai mereu, atunci când datele problemei sunt izomorfe, şi soluţia cea mai rapid de implementat şi de înţeles e cea recursivă. La alte probleme nici nu are rost să îţi pui problema din titlul topicului, mergi cu cea naturală pentru problema respectivă, iterativă.

Cu codul clar, mic, compact, şi evident corect deoarece l-ai făcut "ca din manual", scris în faţa ta, scrii testele, dacă nu le-ai scris înainte ca în TDD, măcar le scrii după, ca-n TAD.

Şi mergi mai departe la alte părţi ale codului. Că programul doar n-o fi făcut doar din acel algoritm. Ai un deadline, nu stai de abureli algoritmiceşti.

Apoi, când treci la profiling, începi să te uiţi pe cifre, şi să optimizezi dacă se impune. Fără profiling, singurul lucru ineficient este pierderea timpului cu întrebări "e mai bine aşa sau invers?". E fix pix, e inginerie, fără cifre nu există răspunsuri.

Summa summarum: oricare ar fi problema şi preferinţele, mai întâi scrii soluţia pe care o poţi implementa 100% corect, fără să transpiri, şi în timp util.

#39
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Mesaje: 15.193
  • Înscris: 25.06.2012
In practica, rareori a trebuit sa rezolv o problema care implica recursivitate. Problema (pentru un incepator, desigur) e sa recunosti cand trebuie sa o faci, si sa stii cum.
Bine spui. Pentru toate trebuie sa existe un motiv, iar optimizarile intensive nu fac exceptie. OK, daca alegi un algoritm ineficient cand unul mai bun iti era la indemana, iti iei palme dupa ceafa; dar si daca stai o saptamana optimizand ce nu trebuie, tot la fel o sa patesti. Sau daca "optimizarile", in mod nejustificat, dauneaza claritatii codului.

#40
trident

trident

    Active Member

  • Grup: Members
  • Mesaje: 1.185
  • Înscris: 15.01.2006
Implementarea aia in Haskell numai in place nu e, deci comparatia nu tine.
Adica ala din C consuma O(N) memorie, ala din Haskell pare sa consuma O( N + N*log(n) ) memorie.

Intre o solutie iterativa si una recursiva e de de preferat aia iterativa atunci cand e suficient de usor de scris ( in general o sa faci economie la memorie si o sa fie si mai usor de inteles ).

#41
wirespot

wirespot

    Senior Member

  • Grup: Senior Members
  • Mesaje: 6.654
  • Înscris: 23.09.2002
@trident, nu neapărat. Limbajele funcţionale nu lucrează cu memoria în modul "clasic". Nu se alocă manual date, multe nici măcar nu au operator de assign de variabile.

Termenul oficial este lazy evaluation. O să dau un citat din "Why functional programming matters" care explică acest aspect (unde "program" poate fi substituit cu "funcţie", "metodă" etc.):

Quote

The program f computes its output which is used as the input to program g. This might be implemented conventionally by storing the output from f in a temporary file. The problem with this is that the temporary file might occupy so much memory that it is impractical to glue the programs together in this way. Functional languages provide a solution to this problem. The two programs f and g are run together in strict synchronisation. F is only started once g tries to read some input, and only runs for long enough to deliver the output g is trying to read. Then f is suspended and g is run until it tries to read another input. As an added bonus, if g terminates without reading all of f’s output then f is aborted. F can even be a non-terminating program, producing an infinite amount of output, since it will be terminated forcibly as soon as g is finished.

Probabil cea mai cunoscută implementare practică a acestui principiu este operatorul pipe (|) din interfeţele cu linie de comandă.

Editat de wirespot, 17 martie 2013 - 14:47.


Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

Utilizatori activi: 1

0 membri, 1 vizitatori, 0 utilizatori anonimi

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