Entwickler-Ecke

Algorithmen, Optimierung und Assembler - reihe


Darkpara - Di 03.06.08 23:33
Titel: reihe
hi zusammen,

bin noch immer bei bleistift und papier mit meinem problem und hoffe ihr könnt mir weiter helfen.
zu meinem problem, ich will eine funktion machen welche ich in meinem program brauche welche:

als input eine länge (int) annimmt von 2 bis unentlich (wobei bei max 100 schluss sein wird)

und als output eine solche reihe produziert:

wenn input = 2 dann ist der string = 15
wenn input = 3 dann ist der string = 135
wenn input = 4 dann ist der string = 1345
wenn input = 5 dann ist der string = 12345
wenn input = 6 dann ist der string = 123445
wenn input = 7 dann ist der string = 1223445
wenn input = 8 dann ist der string = 12234445
wenn input = 9 dann ist der string = 122234445
wenn input = 10dann ist der string = 1222344445
wenn input = 11dann ist der string = 12222344445
wenn input = 12dann ist der string = 122223444445
ect...

nun wollt ich fragen wie ihr das so macht wenn ihr einen algo sucht/programiert? ich habe versucht eine regelmässigkeit zu finden aber ohne erfolg, klar ist es logisch was die nächsten outputs sind aber wie bring ich das ner funktion bei :)

danke für euere hilfe


Dunkel - Mi 04.06.08 00:07
Titel: Re: reihe
Hallo!

user profile iconDarkpara hat folgendes geschrieben:
ich habe versucht eine regelmässigkeit zu finden aber ohne erfolg, klar ist es logisch was die nächsten outputs sind aber wie bring ich das ner funktion bei :)


Wenn es doch, nach Deiner Aussage, logisch ist, was die nächsten Outputs sind, dann wird es wohl auch eine Regelmäßigkeit geben, oder? :wink:

Und da ich gerade ein wenig Langeweile hatte (Schlafen ist ja eh was für Schwächlinge 8) ) habe ich Dir mal was gebastelt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function MyFunc(a: byte): string;
var
  i: Integer;
begin
  Result:= '';
  case a of
    0: Result:= '';
    1: Result:= '';
    2: Result:= '15';
    3: Result:= '135';
    4: Result:= '1345';
    5: Result:= '12345';
  else
    begin
      Result:= '1';
      for i := 5 to a do
        if i mod 2 = 1 then
          Result:= Result + '2';
      Result:= Result + '3';
      for i := 6 to a do
        if i mod 2 = 0 then
          Result:= Result + '4';
      Result:= Result + '45';
    end;
  end;
end;


Bis zur 5ten Stelle gibt es IMHO keine Logik, ab der 6ten fängt aber die Logik an; deswegen die case-Auswahl. Der Rest ist schnell zurechtkodiert; mag sein, dass es bessere Möglichkeiten für Dein Problem gibt, meine funktioniert aber soweit ich das beurteilen kann.

Edit:
user profile iconDarkpara hat folgendes geschrieben:
nun wollt ich fragen wie ihr das so macht wenn ihr einen algo sucht/programiert?

Um auch diese Frage zu beantworten: Regelmäßigkeiten finden (das ist manchmal schwierig, manchmal offensichtlich), diese Regeln zu Papier bringen, und, last but not least, das logische Konstrukt in eine Funktion packen. Ein paar Mal mit bekannten Input- und Outputwerten verifizieren, Fertig. (bei Deinem Problem habe ich insgesamt ungefähr 5 Minuten dafür gebraucht)

Bei Deinem Problem ist mir zuerst aufgefallen, dass die 4 bei geraden Stringlängen immer ein Mal öfter vorkommt als die 2, deswegen das Konstrukt mit dem Modulo (bei der 2 auf ungerade prüfen, bei der 4 auf gerade, jeweils mit versetztem Schleifenstartpunkt).
Man muss sowas ein paar Mal gemacht haben, dann bekommt man ein Gefühl dafür. :lol:


Darkpara - Mi 04.06.08 00:12

oh super vielen dank!


Dunkel - Mi 04.06.08 00:22

por favor :)


Horst_H - Mi 04.06.08 09:52

Hallo,

da ist doich Logik drin.
Länge >= 2.

Position_der_3 = (Länge+1) Div 2 (2,3,4,5,6 ->1,2,2,3,3..)
Fülle alles zwischen 1 bis Position_der_3 mit '2'// for i := 2 to Position_der_3-1 do ..
Fülle Ausgabe[Position_der_3] mit '3'
Fülle alles zwischen Position_der_3 bis Länge mit '4'
Ausgabe[1] immer '1'// überschreibt einmal die 3
Ausgabe[länge] ist immer '5'

Gruß Horst
P.S. Ich hoffe es stimmt so...