Zum Inhalt springen

Rekursion von Visual Quick Basic in C#


Empfohlene Beiträge

Geschrieben

Hallo.

Ich hab gerade eine Aufgabe, und zwar, dass ich eine Rekursion zum Puzzle "Noch Verzwickter!" von Uli Stein von Visual Quick Basic umschreiben soll in C#.

Die Rekursion hab ich vorliegen, jedoch weiß ich nicht genau was mir der Ausdruck "IF ok = 0 THEN" sagen soll :(

Die Rekursion in VBQ findet ihr unten im Anhang.

Vielleicht könnt ihr mir ja helfen? Wär echt lieb!

Liebe Grüße!

PS: Und wenn ihr noch andere Möglichkeiten seht, mir zu helfen, sagt bescheid! DANKE!

AltRekursion_Kommentar.txt

Geschrieben

Achso :D ok, ja den hatte ich aus einer Internetseite von so einem Uralttyp.

Komme da ja selbst nicht mit klar.

Ich bin grad so ziemlich im Gedankenchaos.

Und ich weiß nicht wieso er was wo macht, das ist echt böse.

Weil Programmieren an sich ja nicht schwer ist, aber die Gedankengänge von anderen hinterherzukommen, gerade wenn man das vor 4 Wochen das erste Mal gemacht hat, ist das schon der Hammer :(

Geschrieben

Hab ich schon gemacht, aber das ist sooo komplex, da blick ich als Frischling noch nicht so durch. Und das dann noch in C# reinzupacken . . .

Naja, mein Ausbilder meint, ich schaff das. Allein. Ich glaub nicht dran . . .

Geschrieben

Man sollte beachten, dass Quick (and dirty) Basic nicht objektorientiert ist und C# aber komplett auf OOP aufbaut.

Verschiedene Klassen würde ich daher empfehlen, das machts auch übersichtlicher.

Geschrieben

Naja, mein Ausbilder meint, ich schaff das. Allein. Ich glaub nicht dran . . .

Selbst wenn du es am Ende nicht schaffen solltest, dann hast du einen Lerneffekt wenn du dich selber mit der Aufgabe auseinandersetzt und das ist es worum es dabei hauptsächlich geht.

Aber ich denke mal das dir dein Ausbilder da bei konkreten Problemen auch ein paar Tipps zu geben wird.

Wir hier aber natürlich auch, nur komplett lösen wird das keiner für dich aber davon hättest du ja auch nichts...

Geschrieben

Das will ich ja auch gar nicht :)

Bin ja auch schon relativ weit.

Highlights sind dann immer, wenn das Fenster gescheit aufgeht :)

Glaube schon dass ich das hinbekomm.

Wenn ichs erstmal raus hab, was der Typ da wie gemacht hat . . .

Einzelne Sachen gehen ja sehr gut,

nur im Zusammenspiel ist es knifflig.

Aber das passt schon :)

Thx für die Hilfe!

Geschrieben

Sooo . . . nun Folgendes:

Ich bin jetzt quasi am Ende meiner Übersetzung, nur gibt es einen kleinen Schönheitsfehler, und zwar:

Ich möchte, dass er alle Möglichkeiten der Kartenlegung durchprobiert, bis er irgendwann die umgekehrte Anfangsreihenfolge hat.

Also:

Aus 123456789

soll später 987654321 werden.

Jetzt hatte ich das versucht, indem ich immer die letzte Zahl nehme, und die weiter nach vorn schiebe.

Nun kamen aber immer nur die 1 und die 9 an den Anfang. Also probierte er nicht alles aus.

Ich möchte also jede einzelne kleine Möglichkeit erfassen und die durchspielen lassen.

Habt ihr eine Idee, wie ich das in C# schreiben kann?

Folgendes soll dabei herauskommen, nur ich kenn den Code dafür nicht:

1 2 3 4 5 6 7 8 9

1 2 3 4 5 6 7 9 8

1 2 3 4 5 6 8 7 9

1 2 3 4 5 6 8 9 7

1 2 3 4 5 6 9 7 8

1 2 3 4 5 6 9 8 7

1 2 3 4 5 7 6 8 9

1 2 3 4 5 7 6 9 8

Er soll halt mit den vorhandenen Zahlen (in diesem Fall Karten) - jede nur EINMAL - einfach nur hochzählen. Und wenn er beim nächsten Tausender angekommen ist, dann soll er die nächste Zahl mit einbeziehen, etc.

Ich denke die Gesetzmäßigkeit dahinter habt ihr verstanden, oder?

Liebe Grüße!

Geschrieben (bearbeitet)

Naja, das ist doch das, was ich eigentlich gemacht hatte, oder?

Ich hatte ja vorgegeben, wenn die eine Zahl größer ist, als die davor, dann sollen die getauscht werden.

Aber dadurch werden ja nicht alle Möglichkeiten genannt, sondern es kommt dazu, dass man zwar von 123456789

nach

987654321

aber durch anderes Verschiebeverfahren, welches nicht ALLE Möglichkeiten wahrnimmt,

als wenn man es hochzählt.

Bearbeitet von Lady_Lilith
Geschrieben

Guten Morgen.

Nun habe ich es leider immernoch nicht herausgefunden, wie ich es schreiben soll . . . habe mir zwar Gedanken gemacht, hat aber nicht viel gebracht. Ich weiß jetzt, dass ich die Lexikographische Ordnung aufschreiben muss, weiß jedoch nicht wie. Bei mir steht momentan:

Swap(ref rxString, n, s);

private static void Swap(ref char[] a, int iPos1, int iPos2)

{

char c = a[iPos1];

a[iPos1] = a[iPos2];

a[iPos2] = c;

}

Das vertauscht die beiden Zahlen, die mit n und s betitelt sind.

Hat jemand ne Idee, wie ich das, wie gewünscht, aufschreibe?

Geschrieben
Hat jemand ne Idee, wie ich das, wie gewünscht, aufschreibe?

Du musst doch einfach nur das Beispiel, auf das ich verlinkt habe, nach C# übersetzen, und dort, wo in dem Beispiel swap steht, deine Funktion aufrufen. Zusätzlich wäre es noch gut, wenn die Funktion erkennt, wann das Ende erreicht ist:

static Boolean get_next(char[] a)
{
int i = a.Length - 1;

while (a[i - 1] >= a[i])
{
i = i - 1;
if (i == 0)
return false;
}

int j = a.Length;

while (a[j - 1] <= a[i - 1]) j = j - 1;

// swap values at positions (i-1) and (j-1)
swap(a, i - 1, j - 1);

i++; j = a.Length;

while (i < j)
{
swap(a, i - 1, j - 1);
i++;
j--;
}
return true;
}[/code]

Diese Funktion rufst du solange auf, bis sie false zurückgibt.

Es sind übrigens 9! = 362880 Permutationen.

Geschrieben

Ja, das mit den Permutationen weiß ich, wieviele das sind.

Nur bekomme ich es immernoch nicht wirklich hin.

Ich fühle mich grad ein wenig verschusselt und hab keine Ahnung, was ich dort wie aus meiner Rekursion ersetzen muss:

do

{

Console.SetCursorPosition(0, 0);

Console.WriteLine("Alte Reihenfolge: " + reiheString);

Console.WriteLine("Suche neue Reihenfolge . . . bitte warten . . .");

for (x = 8; x >= 1; x--)

{

if (int.Parse(reiheString.Substring(x, 1)) > int.Parse(reiheString.Substring(x - 1, 1)))

{

n = x - 1;

x = 0;

}

}

nString = reiheString.Substring(n, 1);

z = -1;

sString = "";

do

{

z++;

if (z >= 9)

{

return;

}

sString = reiheString.Substring(int.Parse(nString) + z 1);

s = reiheString.IndexOf(sString, n + 1);

} while (s == -1);

for (x = 0; x < 9; x++)

{

rxString[x] = reiheString[x];

}

Swap(ref rxString, n, s);

reiheString = reiheString.Substring(0, n) + sString;

for (x = 0; x < 9; x++)

{

for (y = n+1; y < 9; y++)

{

if (rxString[y] == (char)(49 + x))

{

reiheString = reiheString + rxString[y];

}

}

}

anzahlInt = anzahlInt + 1;

for (x = 0; x < 9; x++)

{

r = int.Parse(reiheString.Substring(x, 1));

for (b = 0; b < 5; b++)

{

kString[x, b] = dString[r - 1, b];

}

}

Display(kString);

if (Dreh(ref kString))

{

Display(kString);

Console.ReadKey();

}

} while (reiheString != "987654321");

private static void Swap(ref char[] a, int iPos1, int iPos2)

{

char c = a[iPos1];

a[iPos1] = a[iPos2];

a[iPos2] = c;

}

Ich habe momentan leider ein totales Blackout und weiß absolut nicht, wie ich das da rein bekommen könnte, sodass es mit MEINEN Variablen funktioniert. Würdest du dir die Mühe machen, und mir das da rein packen? Wäre echt lieb.

Geschrieben

Du brauchst gar keine Rekursion, die Funktion oben ist alles, was du brauchst. Das funktioniert übrigens mit jedem Array, egal ob Zahlen oder Buchstaben, egal wie lang. Ich mach einfach mal ein ganzes Programm draus:

class Program
{
private static void swap(char[] a, int iPos1, int iPos2)
{
char c = a[iPos1];
a[iPos1] = a[iPos2];
a[iPos2] = c;
}

static Boolean get_next(char[] a)
{
int i = a.Length - 1;

while (a[i - 1] >= a[i])
{
i = i - 1;
if (i == 0)
return false;
}

int j = a.Length;

while (a[j - 1] <= a[i - 1]) j = j - 1;

// swap values at positions (i-1) and (j-1)
swap(a, i - 1, j - 1);

i++; j = a.Length;

while (i < j)
{
swap(a, i - 1, j - 1);
i++;
j--;
}
return true;
}

static void Main(string[] args)
{
char[] a = "123456789".ToCharArray();
do
{
System.Console.Out.WriteLine(a);
} while (get_next(a));
}
}[/code]

Geschrieben

Nunja, dass das funktioniert habe ich durch testen jetzt gesehen.

Es ist nur so, dass ich ein ganz anderes Projekt habe.

Das mit der Sortierung soll ja IN das Projekt.

Es geht darum:

Ich habe hier ein Puzzle von Uli Stein.

Dort gibt es 9 verschiedene Karten, deren Kanten bei nur EINER möglichen Anordnung zusammenpassen.

Diese Reihenfolge der Karten möchte ich herausfinden, und dazu muss ich alle Möglichkeiten der Anordnung durchspielen (das wäre ja jetzt der Teil, den du hier reingeschrieben hast.

Es soll ja in JEDEM Durchgang EINE Karte vertauscht werden, dann wird geschaut, ob sie zur nächsten Karte passt in Bezug auf deren Kanten und wenn nicht, gibt es eine neue Vertauschung und das Programm läuft von vorn durch.

Es geht hier nicht allein um diese Sortierung, sondern die soll IN mein Programm rein.

Mein Problem ist jetzt: Ich weiß nicht, wie ich das darin einfügen soll.

Geschrieben
Es soll ja in JEDEM Durchgang EINE Karte vertauscht werden
Warum? Hauptsache ist doch, dass jede Permutation drankommt.

Mein Problem ist jetzt: Ich weiß nicht, wie ich das darin einfügen soll.
Bau deine Prüfung an Stelle der Ausgabe in Main ein.
Geschrieben

Aber es soll ja erst geprüft werden und da kann ich ja nicht laufend durchsortieren, sondern muss prüfen, obs passt, dann kann ich die nächsten Karten vertauschen. Da sind ja noch andere Dinge am Werk. Hier mal komplett, dass du dir das vorstellen kannst, wie ich das meine.

PuzzleRek.txt

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...