![]() |
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' |
Re: teilweise permutation
"permutation" ist als procedure deklariert und hat keinen Rückgabewert. Daher der Fehler.
|
Re: teilweise permutation
:wall: ok thx^^
|
Re: teilweise permutation
Code:
irgendwie funktioniert das nicht...das programm bricht nach ner zeit ab(overflow) und gibt nur ad aus(bei eingabe abcde).
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; hat jemand schon einmal jemand einen ähnlichen algorithmus geschrieben? Beispiele wären hilfreich. :( :( :( |
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. |
Re: teilweise permutation
Hier mal ein Vorschlag...
Delphi-Quellcode:
Gruss
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; Thorsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 Uhr. |
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