| Autor |
Beitrag |
Smaik
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 15.03.10 17:48
Hallo,
habe nur eine kleine, aber mir kopfzerreißende Frage.
Und zwar beschäftige ich mich gerade mit Funktionen in C#, sowohl iterativ als auch rekursiv.
Nun soll ich eine rekursive Funktion schreiben, welche den Index des kleinsten Elements im Array ausgibt.
Das Gerüst sieht wiefolgt aus:
C#-Quelltext 1: 2: 3: 4:
| static int MinIndexrekursiv(int[] zahlen, int anfang) {
} |
zahlen ist das Int-Array und der Integer anfang beschreibt eben den Anfangsindex der "Suche".
Brauche diese Funktion für mein SelectSort, was ich danach auch noch iterativ und rekursiv proggen muss
Iterativ ist das für mich alles kein Problem, aber bei der Rekursion muss man die Gehirnzelle schon etwas mehr anstrengen  .
PS: Habe schon Vorkenntnisse zum Thema Rekursion (Fakultät, Fibonacci, Potenzieren etc.)
Please, help me!!!
Thx, im Voraus.
Moderiert von Christian S.: C#-Tags hinzugefügt
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 15.03.10 17:51
Ich würde sagen, Du musst das Element an der Position anfang mit dem Minimum der Elemente die danach kommen vergleichen. Letzteres ist dann der rekursive Aufruf.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Smaik 
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 15.03.10 17:58
Ja, theoretisch schon, nur weiß ich nicht, wie ich das umsetzten soll - teste hier schon knapp 3h rum xDD. Bei einem Array kann ich ja nicht .remove(...) machen.
Wäre schon, wenn jmd ein Bisschen Quelltext schreiben könnte, damit ich das besser verstehe.
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mo 15.03.10 17:58
Hallo und  ,
da es eine Übungsaufgabe ist, werde ich keinen konkreten Code liefern (sonst machts ja keinen Sinn für dich
Also rekursion heißt ja immer, dass die Methode sich selber aufruft. Also muss du innerhalb der Methode wiederum die Methode aufrufen. Des weiteren brauchst du eine End-Bedingung, die diesen Kreislauf verlässt, sonst hast du eine Endlosschleife.
Deshalb sieht eine rekursive Funktion prinzipiell wie folgt aus:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| <modifier> <rueckgabewert> <NameDerRekursivenMethode>(<Parameter>) { <logik>
if (<Bedingung>) { return <NameDerRekursivenMehotde>(<AngepassterParameter>); } else { return <value>; } } |
Ich hoffe das war nicht zu viel und nicht zu wenig
Gruß Daniel
|
|
Smaik 
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 15.03.10 18:04
wie eine Rekursion aufgebaut wird, weiß ich. Das ist nicht meine 1. Aufgabe dazu, sondern die 11. ...
PS: Ja, es war zu wenig  bin jetzt noch auf demselben Stand wie vor 10Min. hehe
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 15.03.10 18:17
Smaik hat folgendes geschrieben : | | Bei einem Array kann ich ja nicht .remove(...) machen. |
In Daniels Code kommt etwas vor, was sich AngepassterParameter nennt. Zusammen mit meiner Beschreibung sollte Dich das auf eine Idee bringen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mo 15.03.10 18:17
hmmmmm, ....
Also du musst solang rekursiv gehen, bis du nur noch zwei Zahlen übrig hast. Das ist die Bedingung.
Dann musst du vergleichen ob eben die Letzte oder die Vorletzte kleiner ist (dazu kannst du Math.Min verwenden ... oder if/else  ) und die kleiner zurück geben.
Die von dem Aufruf merkst du dir und vergleichst sie dann mit der aktuellen Zahl (wobei du wieder die kleinste zurück gibst). Und zack fertig
Hilf das?
|
|
Smaik 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 18.03.10 09:39
Sooo... 3 Tage sind verstrichen und es funzt immer noch nicht  weiß echt nicht mehr weiter.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 18.03.10 10:24
Smaik hat folgendes geschrieben : | Sooo... 3 Tage sind verstrichen und es funzt immer noch nicht weiß echt nicht mehr weiter. |
Schön. Was hast Du denn in den drei Tagen gemacht, um das Problem zu lösen? Wo kommst Du nicht weiter, welcher Teil der Erklärungen hier ist Dir unklar?
Ich vermisse irgendwie Eigeninitiative von Deiner Seite!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Do 18.03.10 10:58
Wie weit bist du den?
Ich habe es für dich Implementiert, da ich aber keinen (lern-)Sinn darin sehe, dir einfach den Code hinzuschmeißen habe ich den Algorithmus in meinem vorherigen Post versucht in Worte zu schreiben. Hast du mal versucht das so umzusetzen?
Bitte versuche das und poste den Code, dann helfe ich dir gerne bei den Details.
|
|
Smaik 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 18.03.10 12:20
sooo... habs jetzt fast so gemacht wie du es beschrieben hast.
die kleinste zahl bekomm ich am ende auch, allerdings ist das ja nicht die lösung, zudem ich mir das ganze array "zerstöre" und somit am ende nicht mehr auf den index zurückkomme:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| static int MinIndexrekursiv(int[] zahlen, int anf) { int zahlmin = zahlen[anf]; if (zahlen.Length == anf + 1) return zahlmin; else if (zahlmin > zahlen[zahlen.Length-1]) { zahlen[anf] = zahlen[zahlen.Length-1]; Array.Resize(ref zahlen, zahlen.Length-1); return MinIndexrekursiv(zahlen, anf); } Array.Resize(ref zahlen, zahlen.Length - 1); return MinIndexrekursiv(zahlen, anf); } |
Er vergleich also immer die kleinste Zahl mit der letzten des Arrays und merkt sie sich dann entweder in zahlen[anf] oder nicht und verkleinert danach das Array um 1.
Bis jetzt hab ich noch keinen anderen Weg gefunden... ja ich weiß, die Lösung ist übelst schlecht und führt nicht mal zum ziel:P
Die wirkliche Problematik ist bei mir, dass ich ja n Integer zahlmin erstelle und dieser bei jedem Aufruf der Funktion neu zugewiesen wird mit den veränderten Parametern.
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Do 18.03.10 12:32
|
|