So geht das!
Nachdem sich in letzter Zeit die Fragen, wie denn der Anagramm-Generator
funktioniert, häuften, habe ich mich endlich mal daran
gemacht, hier auch eine kurze Beschreibung der Funktionsweise zur
Verfügung zu stellen.
Folgende Schritte werden ausgeführt:
- Einlesen der Wortliste, aussortieren aller Wörter, die andere als
die angegebenen Buchstaben (=Suchwort) enthalten
- Sortieren dieser (Rest-)Liste nach der Länge, so daß das
längste Wort zuerst kommt.
- nächstes Wort aus der Liste wählen (am Anfang: erstes Wort)
- Restbuchstabenliste aufbauen, indem man die Buchstaben dieses Wortes
aus den bisherigen Restbuchstaben entfernt (am Anfang: Restbuchstaben =
alle Buchstaben des Suchbegriffs)
- die Liste ab dem gerade betrachteten Wort (exklusive) durchgehen,
bis ein Wort gefunden wird, daß aus allen oder einem Teil der
restlichen Suchbuchstaben gebildet werden kann.
- a) Wenn ein Wort gefunden wird, das aus sämtlichen
Restbuchstaben
besteht, dann wurde ein Anagramm gefunden. Dieses besteht aus den
nacheinander gefundenen Wörtern. Es wird ausgegeben und dann geht
die Suche bei Punkt 5 weiter.
- b) Besteht ein gefundenes Wort nicht aus allen Restbuchstaben, dann
rekursiv weiter bei Punkt 4.
- c) Wenn keines mehr gefunden wird, dann Rücksprung (also
Programmende
oder höhere Rekursionsstufe)
Wenn man doppelte Wörter zulassen will, dann muß man die Liste
bei der Suche nach dem Punkt 5b inklusive dem gerade betrachteten
Wort weiter durchgehen.
Ich hoffe, ich konnte das klar darlegen. Wenn nicht ->
fragen!
Das ganze ist die Kurzform, verschiedene Optimierungen wurden hier nicht
beachtet. Für eine genauere Beschreibung verweise ich auf die
Wordplay-Dokumentation
(englisch), in der Evans A Criswell den rekursiven
Algorithmus folgendermaßen beschreibt:
int recursive_anagram (string, accumulation, level):
{
if no vowels in string, decrement level, return (dead end)
go through list of important candidate words: for each:
{
attempt to extract the word from the string passed into the function.
if extraction not possible, continue (try next word)
if extraction was perfect (left no letters), print the anagram
(accumulation plus the word), then decrement the level,
return
if extraction was successful, but left some letters, add the word to
accumulation, increment level, and call the function
with args (<<whatever is left after extraction>>,
accumulation, and level)
}
if no extractions were a success, decrement level and return.
decrement level and return anyway, since we're at the end. :-)
}
Zurück zur Hauptseite