Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi teilweise permutation (https://www.delphipraxis.net/108320-teilweise-permutation.html)

ajaxson 11. Feb 2008 20:12

Re: teilweise permutation
 
um jetzt mal wieder zu mir zurück zu kommen :lol:

procedure permutation(eingabe:string);
var ergebnis:string;
begin
while x=length(eingabe) -2 do
begin
ergebnis := copy(eingabe,1,1) + permutation(copy(eingabe,2,length(eingabe)-2)) + copy(eingabe,length(eingabe)-1,1);<----die zeile wird als fehler markiert
x:=x+1;
end;
end;

er gibt mir folgende fehlermeldung:[Pascal Fehler] Unit1.pas(79): E2010 Inkompatible Typen: 'string' und 'procedure, untyped pointer or untyped parameter'

Namenloser 11. Feb 2008 20:14

Re: teilweise permutation
 
"permutation" ist als procedure deklariert und hat keinen Rückgabewert. Daher der Fehler.

ajaxson 11. Feb 2008 20:20

Re: teilweise permutation
 
:wall: ok thx^^

ajaxson 11. Feb 2008 20:54

Re: teilweise permutation
 
Code:
function permutation(eingabe:string):string;
var ergebnis:string;
begin
while x<>length(eingabe) -2 do
 begin
  x:=x+1;
  ergebnis := copy(eingabe,1,1) + permutation(copy(eingabe,2,length(eingabe)-2)) + copy(eingabe,length(eingabe)-1,1);

  form1.Memo1.Lines.Add(ergebnis);
 end;
  end;
irgendwie funktioniert das nicht...das programm bricht nach ner zeit ab(overflow) und gibt nur ad aus(bei eingabe abcde).
hat jemand schon einmal jemand einen ähnlichen algorithmus geschrieben? Beispiele wären hilfreich. :( :( :(

Medium 12. Feb 2008 00:33

Re: teilweise permutation
 
Wenn du jetzt noch "ergebnis" einfach mal nach Englisch übersetzt, und aus der Variablendeklaration heraus nimmst, bist du schon mal ein großes Stück weiter. Ob ein ordentliches Abbruchkriterium erreicht wird kann ich dank Müdigkeit gerade nicht sehen, ich finde es aber schon seltsam eine while-Schleife in einer Rekursion dort einzusetzen, in der die Rekursion statt findet. Darüber hinaus scheint "x" irgendwo deklariert zu sein, und ist somit wohl auch noch für alle rekursiven Aufrufe das selbe. Macht auf mich grad einen recht planlosen Eindruck, will aber nicht ausschließen dass auch ich morgen nach ein paar Stunden Schlaf erkenne was du da machst ;)

Edit: Also... irgendwie... WAS zum Geier soll da passieren!? Du rufst eine Funktion auf, die die inneren Zeichen eines Strings herauskopiert, und damit rufst du die Funktion nochmal auf. Das tust du sogar noch so oft, wie der String lang ist minus 2. Die rekursiv aufgerufenen Funktionen tun das selbe, nur mit den verkürzten Strings, und gibst diese dann zurück, und schreibst das in ein Memo. Ganz nebenbei zählst du eine Variable irgendwie hoch, die nachher irgendwas wildes enthalten dürfte, aber niemals zum Terminieren der Rekursion führen wird. Das ist von vorne bis hinten Unsinn. Ich empfehle mindestens die Wikipedia-Einträge zur Rekursion und Permutation zu lesen (und verinnerlichen), und zudem ein paar Pascal-Grundlagen ("result" anyone?). Weil wenn wir so weiter machen, wirds ein Geschustere, und am Ende wird irgendwer entnervt einfach eine fertige Funktion posten die du kopieren kannst, aber mehr wissen wirste dann auch nicht.

omata 12. Feb 2008 01:30

Re: teilweise permutation
 
Hier mal ein Vorschlag...

Delphi-Quellcode:
procedure permutation(mitte:string; Liste:TStrings);

  procedure permut(links, mitte, rechts:string);
  var i:integer;
      temp:string;
  begin
    if mitte = '' then
      Liste.Append(links + rechts)
    else
      for i:=1 to length(mitte) do begin
        temp:=mitte;
        delete(temp, i, 1);
        permut(links + mitte[i], temp, rechts);
      end;
  end;

var links, rechts:string;
begin
  Liste.Clear;
  links:=copy(mitte, 1, 1);
  delete(mitte, 1, 1);
  rechts:=copy(mitte, length(mitte), 1);
  delete(mitte, length(mitte), 1);
  permut(links, mitte, rechts);
end;

procedure TForm.ButtonClick(Sender: TObject);
begin
  permutation('ABCDEFG', Memo.Lines);
end;
Gruss
Thorsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz