Selbsterzeugende Liste, in der jedes Element einige Elemente an das Ende anhängt

7

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?

    
Luka Horvat 10.01.2014, 23:50
quelle

3 Antworten

7

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 .

    
Ganesh Sittampalam 11.01.2014, 00:02
quelle
13

Die folgende Lösung verwendet eine selbstreferenzierende faule Liste und hat daher nicht das lineare Zeitproblem der Lösung von @GaneshSittampalam:

%Vor%     
Ørjan Johansen 11.01.2014 01:23
quelle
0

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

hinzu

so:

%Vor%     
Jean-Bernard Pellerin 10.01.2014 23:59
quelle

Tags und Links