![]() |
AW: Rekursion vs. Iteration
Vielleicht sollten wir uns erst einmal einigen, was unter Algorithmus zu verstehen ist. Es geistern hier "Algorithmus", "Algorithmen-Basis", "Problem-Stellung" usw durcheinander.
Und natürlich ist es sinnvoll, den "Apfel"-Algorithmus mit exponentieller Laufzeit mit dem "Birnen"-Algorithmus mit logaritmischer Laufzeit zu vergleichen, uns sei's nur darum, umherauszufinden welcher ein bestimmtes Problem "besser" löst. "Besser" kann situationsabhängig sein: Wenn ich schnell ein Problem lösen muß bis n=10, ist es ev. "besser" einen quick-und-dirty O(2^n)-rekurven Algorithmus in 5 min zu implementieren, als einen hochoptimierten O(log(n)) iterativen, der aber erst ab n>1000 schneller ist und nach 5 Tagen fertig ist. |
AW: Rekursion vs. Iteration
Zitat:
Zitat:
Allein, daß die Rekursion bei Fibonacci wiederholt (!) Zwischenwerte generiert, was die iterative Variante eben nicht tut, macht sie mir suspekt. Du warst es, der Rekursion vs. Iteration im wesentlichen auf Hardware reduziertest. Nun, dann frage ich mich, warum Windows trotz immer schnellerer Computer weiterhin dauerlahmt. Zitat:
Zitat:
|
AW: Rekursion vs. Iteration
Und ? Ich poste ja nicht für Ihn sondern für Alle.
PS: mal davon abgesehen bin ich immer für sachliche Gegenargumente offen, denn keiner kann sich jemals 100% sicher sein das sein Wissen vollständig ist. Vielleicht kommt ja ein Experte für Quantencomputer hier vorbei und berichtet von den neusten Erkenntnissen der Mathematik/Informatik und zeigt uns eine neue Sichtweise die unser Wissen vervollständigt. |
AW: Rekursion vs. Iteration
@Hagen: Ich glaube, wir haben verstanden, was du meinst.
@Delphi-Laie: wenn du beweisen kannst das iterativ immer besser als rekursiv ist, würdest du dafür vielleicht sogar den Nobelpreis bekommen. |
AW: Rekursion vs. Iteration
Zitat:
greetz Mike |
AW: Rekursion vs. Iteration
Zitat:
Problemstellung -> Formel/Algortihmus -> Implementierung auf jeweiliger HW mit spezifischer SW -> rekursiv vs. iterativ Das wäre mein Vorschlag. Das Aufwand-Nutzen-Verhältnis sollten wir aussen vor lassen. Gruß Hagen |
AW: Rekursion vs. Iteration
Ich denke, dass eine Meta-Diskussion über die Diskussion nicht zielführend ist -ebensowenig wie die Frage, ob Windows trotz schnellerer Computer nach wie vor langsam sei. Als Randbemerkung möchte ich die Aussage von Markus vielleicht präzisieren: Es geht nicht darum, wer negaH ist,sondern darum, dass er durch das DEC und unzählige wertvolle und inhaltliche hochwertige Beiträge vielfach unter Beweis gestellt hat, sich im Bereich der theoretischen Informatik bestens auszukennen. Damit hat er nicht pauschal Recht - dieses Privileg habe lediglich ich als Admin *g* - aber wir sind weit über den Punkt hinaus, an dem wir überlegen müssen, ob negaH jemals schon einen rekursiven Algorithmus entwickelt hat. ;-)
|
AW: Rekursion vs. Iteration
Zitat:
Ich habe die Fibonacci-Folge rekursiv und iterativ für die Zahlen 10,20... bis 90 berechnet und ausgegeben (92 ist die grösste Zahl, für die die Fibonacci-Funtion noch in ein int64 passt). i rec(10*i) --- -------- 1: 55 2: 6765 3: 832040 4: 102334155 5: 12586269025 6: 1548008755920 7: 190392490709135 8: 23416728348467685 9: 2880067194370816120 Zeit: 00:00:00 i iter(10*i) --- -------- 1: 55 2: 6765 3: 832040 4: 102334155 5: 12586269025 6: 1548008755920 7: 190392490709135 8: 23416728348467685 9: 2880067194370816120 Zeit: 00:00:00 Die Zeit, die die beiden Verfahren brauchen, ist vernachlässigbar. Natürlich, wenn man jedes Zwischenergebnis unzählige Male neu berechnet, geht die Performance in den Keller, aber das hat nicht mit Iteration vs. Rekursion zu tun, sondern nur mit Unfug programmieren.
Delphi-Quellcode:
var
Feld: array [0..92] of int64; procedure initfeld; var i: integer; begin feld[0] := 0; feld[1] := 1; for i := 2 to 92 do feld[i] := -1; // noch nicht berechnet end; function iter(n: Integer): Int64; var h: Integer; begin if feld[n] < 0 then for h := 2 to n do if feld[h]<0 then feld [h] := feld[h-1]+feld[h-2]; result := feld[n]; end; function rec (n: integer): int64; begin if feld[n]<0 then feld[n] := rec(n-1)+rec(n-2); rec := feld[n]; end; procedure TMainForm.Button2Click(Sender: TObject); var i: Integer; t: TDatetime; begin Memo1.Lines.Clear; Memo1.Lines.Add('i rec(10*i) '); Memo1.Lines.Add('--- -------- '); initfeld; t := now; for i := 1 to 9 do Memo1.Lines.Add(Format('%2d: %8d ', [i, rec(10*i)])); Memo1.Lines.Add('Zeit: '+TimeToStr(now-t)); Memo1.Lines.Add('i iter(10*i) '); Memo1.Lines.Add('--- --------'); initfeld; t := now; for i := 1 to 9 do Memo1.Lines.Add(Format('%2d: %8d ', [i, iter(10*i)])); Memo1.Lines.Add('Zeit: '+TimeToStr(now-t)); end; |
AW: Rekursion vs. Iteration
Ich hätte auch noch eine rekursive Version auf Lager, die ohne das zusätzliche Feld auskommt:
Code:
Berechnet keine Ergebnisse doppelt, und sollte von der Laufzeit her mit einer iterativen Version mithalten können.
private uint fib(uint n)
{ if (n == 0) return 0; else return fib(n, 1, 0); } private uint fib(uint n, uint x, uint y) { if (n == 1) return x; else return fib(n - 1, x + y, x); } |
AW: Rekursion vs. Iteration
Zitat:
... warum Windows... lahmlegt. Dir ist schon bewusst das wir hier "iterativ vs. rekursiv" diskutieren ? Und du führst als Agrumentation Windows oder Assembler an. Jeder geht dann davon aus, besonders weil du pro "iterativ" argumentierst, das somit Windows langsammer wurde weil es rekursive Implementierungen bevorzugt. Zitat:
Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz