new Account() schrieb:
Gerade weil es üblich ist, beschränke ich mich auf diese Sichtweise.
Kann man machen. Ist aber nicht verkehrt, wenn man darauf hinweist, dass es eben nicht allgemeingültig ist.
Und das soll ja auch kein wie auch immer gearteter Vorwurf sein. Den (als Ergänzung gedachten) Hinweis habe ich ja gegeben und damit ist die "Mission" erfüllt. :-)
new Account() schrieb:
Und damit hat man auch keine Rekursion mehr.
Stimmt. Ist aber unerheblich. Den die Vorgehensweise die der Quelltext beschreibst ist ohnehin nie, wie sie dann in der Hardware stattfindet.
Genau das ist ja auch der Sinn einer (höheren) Programmiersprache. Das man eben Dinge auf einem (höherem/anderen) Level formulieren kann und dem Compiler/Interpreter die konkrete Umsetzung überlässt.
new Account() schrieb:
Dann ist es aber nicht mehr stackbasiert.
Hat ja auch keiner behauptet. Aber das war ja auch gar nicht der Punkt.
Ich finde solche Einwürfe die sich irgendeinen einzelnen Aspekt rauspicken auch immer eher verwirrend. Ich hab dann immer das Gefühl, dass Du gar nicht verstanden hast, was Du sagen willst und die Einzelaspekte auch so teilweise keinen wirklichen Sinn ergeben.
Wie hier eben. Es ging nicht um stackbasiert oder nicht. Es ging um Rekursion und die Tatsache, dass Rekursion nicht automatisch den Stack belasten muss. Sozusagen um eine Auftrennung der Konzepte Stack und Rekursion. Weil sie halt nicht zusammen gehören, auch wenn es so scheint weil sie gerade im Mainstream häufig so anzutreffen sind.
Das worauf ich hinaus wollte ist das aufzubrechen und zu zeigen, dass es verschiedene Dinge sind und man sie zwar zusammenpacken kann aber nicht muss.
new Account() schrieb:
Die Umsetzung, die den Stack aber ablöst und endlos Rekursion sinnvoll macht, würde ich gern sehen.
Naja sinnvoll ist immer so ne Frage. Ich meine, ich hatte ja zu einer Endlos-Rekursion ein Beispiel gegeben. Und in
Scheme hast Du halt auch kein Äquivalent Wirkliches zu
while, weshalb Du zur Rekursion greifen musst (wobei die Abwesenheit von while auch nicht als Makel empfunden wird; man braucht es nicht; auch nicht im Falle einer Endlosschleife).
Ansonsten muss man sich bei solchen Endlos-Schleifen (egal ob iterativ oder rekursiv) eigentlich grundlegender fragen, ob die sinnvoll ist. Denn kein Code soll ja wirklich bis in alle Ewigkeit laufen. Irgendeine Abbruchbedingung hat man ja zumindest indirekt immer. Oftmals sind Lösungen mit Endlosschleifen eher ein Hack.
Und wenn man sie dann doch nimmt, sollte man überlegen, wie man es am besten umsetzt.
Eine Umsetzugn a-la
while true
ist natürlich auch immer so ein bisschen Missbrauch von while, da man einfach ne Bedingung setzt die in jedem Fall wahr ist.
Ich würde dahin tendieren für Endlosschleifen ein generisches Makro zu schreiben (jetzt mal unabhängig davon, ob man es iterativ oder rekursiv löst):
Code:
(define-syntax-rule (infinite-loop body ...)
(let loop ()
body
...
(loop)))
Damit kann man nu an benötigter Stelle einfach schreiben:
Code:
(infinite-loop
(do)
(somthing))
und es geht klar und unmissverständlich aus dem Quelltext hervor, dass hier eine Endlosschleife abgearbeitet wird.
Und das wäre eigentlich an der Stelle auch noch der wichtigere (zumindest aber genauso wichtige) Hinweis. Das man sich bemüht den Quelltext so zu schreiben, dass klar wird, was da geschieht. Notfalls auch mit Kommentaren.
new Account() schrieb:
Die Sinnigkeit endlos-Rekursion in einer beliebigen technischen Umsetzung (d.h. wo sie wirklich präsent ist, d.h. nicht irgendwie wegoptimiert wird, o.ä.) ist immer noch nicht geklärt.
Ich hoffe im Rahmen dieses Postings ist die Frage geklärt.
Ansonsten ist es mit Sinnfragen halt immer ein wenig kompliziert. Ich kann genauso gut argumentieren, dass man keine
while-Schleifen braucht und tatsächlich wird sich auch kein Problem konstruieren lassen, welches zwingend auf
while angewiesen ist.
Abseits davon ist Sinn aber trotzdem noch unscharf definiert.
Präziser meint es ja eigentlich, welche Vor- und Nachteile haben die jeweiligen Implementationsvarianten insbesondere hinblicklich der Kriterien Performance, Speicherplatzverbrauch, Aufwand der Implementierung, Lesbarkeit des Codes.
Im Allgemeinen wird keiner der beiden Lösungen (Endlosschleife vs. Endlosrekursion) die "sinnvollere" Wahl sein.
Viel mehr manifestiert sich sich ne Antwort dann, wenn man festlegt, in welcher Programmiersprache man sich bewegt und/oder welchen Skill der Programmierer hat.
Und bei
Scheme endet das halt dann bei Rekursion. Bei beispielsweise
Java würde dagegen die Lösung eher Schleife heißen (wegen Stacküberlaufgefahr).
new Account() schrieb:
(Mein Timerbeispiel ist, wie ich fälschlicherweise behauptet habe, nach meinem Verständnis eigentlich keine Rekursion - bin mir aber nicht 100% sicher)
Eher nicht. Der Hardware-Timer ist ja eher nur ein Zähler der gekoppelt an ein ein gleichmäßig schwingendes System (Oszillator). Bei jedem "Peak" wird sozusagen der Zähler um eins hochgezählt.
new Account() schrieb:
Wie soll das überhaupt aussehen? Das Programm müsste ewig laufen - d.h. ich schalte heut meinen Computer ein, starte das Programm und stoppe es nie (sonst würde es ja keine Endlosrekursion machen).
Ja. Das Problem der Unendlichkeit habe ich ja weiter oben diskutiert. Das es sie ja eigentlich nicht gibt und das es eher ein Hilfskonstrukt für die Problemlösung ist, aber es nicht darum geht, dass etwas unendlich mal ausgeführt werden soll bzw. unendlich lange läuft.
Bezogen auf den Hardwaretimer (der aber ohne Rekursion auskommt) ist es halt so: Kein Strom -> kein Zählvorgang
Allerdings haben alle modernen PCs heutzutage eine Batterie die u.a. halt auch die Uhr am laufen hält.
new Account() schrieb:
Es geht immer noch um ENDLOS laufende Rekursion. Der Backtracking Algorithmus würde garnicht funktionieren, wenn die Rekursion endlos tief gehen würde.
Auch hier wieder die Thematik verfehlt. Es ging bei der Erläuterung gar nicht um Unendlichkeit. Es war ein Beispiel, für eine Rekursion mit Zustandsspeicherung Sinn macht.
new Account() schrieb:
Anmerkung: Deine Ausführungen sind sehr interessant, aber irgendwie bleiben die nicht beim Thema.
Mir war auch nicht ganz klar, worum es Dir ging weil eben viele Fragen kamen, die damit nur indirekt was zu tun hatten oder wo Verständnisprobleme zu sein schienen.
Und die Frage nach dem Sinn würde ja eigentlich schon längst beantwortet. Ich hab versucht es nochmals in diesem Posting klar zu machen.