Ich suche nach einer Möglichkeit, so etwas zu tun. Angenommen, wir beginnen mit 1. Für jede ungerade Zahl addieren wir +5 am Ende der Liste. Für jede gerade Zahl addieren wir +3 und +7 am Ende der Liste. Die Liste würde so aussehen
[1, 6, 9, 13, 14, 18, 17, 21, 21, 25, ...]
Wie würde ich etwas in Haskell machen?
Mir ist bewusst, dass Sie eine Liste erstellen können, in der jedes Element von den vorherigen abhängt, aber wie machen Sie das, wenn mehr als ein Element von demselben Element abhängt und Sie nicht wissen, welche Gruppe davon abhängt Es sei denn, Sie fangen von vorne an?
Es ist ziemlich ähnlich wie Sie es tun würden, wenn nur ein einzelnes Element gleichzeitig erzeugt würde. In diesem Fall würden Sie einen einzelnen Wert übergeben, um den "Keim" für die nächsten Elemente zu verfolgen. In diesem Fall können Sie einfach eine Liste übergeben:
%Vor% Die allgemeine Idee ist, dass das Argument für process
alle Zahlen enthält, von denen wir wissen, dass sie in der Ausgabeliste sein sollten, für die wir aber noch keine "konsequenten" Zahlen hinzugefügt haben. Um Fortschritte zu machen, inspizieren wir die erste, "Ausgabe", indem wir sie an die Spitze des Ergebnisses setzen, und berechnen die Folgezahlen und setzen diese in die Liste, die auf die Verarbeitung wartet. Indem wir sie am Ende stellen, sorgen wir dafür, dass alles sozusagen an die Reihe kommt.
Beachten Sie, dass das Einfügen von Werten am Ende mit einer naiven Listenverkettung bedeutet, dass dieser Algorithmus technisch eine lineare Zeit dafür benötigt, wie weit er durch die Liste gekommen ist, um die nächste Zahl zu erzeugen. Dies kann durch Verwendung einer effizienteren Datenstruktur wie Data.Sequence erfolgen .
Die folgende Lösung verwendet eine selbstreferenzierende faule Liste und hat daher nicht das lineare Zeitproblem der Lösung von @GaneshSittampalam:
%Vor%Mein Haskell ist scheiße, also hier ist ein Umriss mit falschem Code.
Sie können es mit einem Filter tun.
Beachten Sie, dass für jede ungerade Zahl: 2x + 1
Du fügst 2x + 6 zu deiner Liste hinzu
Für immer gerade Zahl: 2x
Sie fügen 2x + 3 und 2x + 7
so:
%Vor%Tags und Links haskell