wolle87 Geschrieben 22. Juni 2010 Geschrieben 22. Juni 2010 Hi, haben in der Berufsschule die Aufgabe bekommen, die Methode Length() nachzuprogrammieren. static int GetLaenge(string sString) { int i=0; try { while (Convert.ToString(sString[i]) != "") { i++; } } catch (IndexOutOfRangeException) { Console.Write(""); } return i; } Das ist meine Lösung. Funktioniert auch, nur halte ich das doch ehr für suboptimal wenn ihr versteht was ich meine Gibts andere Möglichkeiten als die Exception abzufangen ? Zitieren
Mcolli Geschrieben 22. Juni 2010 Geschrieben 22. Juni 2010 (bearbeitet) Die länge eines string errechnet sich immer aus: 1 + "Die Länge des Strings, der rechts vom ersten Zeichen ist" also: Lienar-rekursiv static int GET_LAENGE(string wort) { // Die "Abbruch bedingung der Rekursion if (s == "") { [INDENT] return 0;[/INDENT] } else { [INDENT]return 1 + GET_LAENGE(s.Substring(1));[/INDENT] } } Endrekursiv: static int GET_LAENGE(string wort, int laenge) { // Die "Abbruch bedingung der Rekursion if (s == "") { [INDENT]return laenge;[/INDENT] } else { [INDENT]return GET_LAENGE(s.Substring(1), laenge + 1);[/INDENT] } } Die Abbruchbedingung ergibt sich immer dadurch wenn man Versucht das Problem trivial zu betrachten. In dem Fall heisst trivial wenn der String leer ist also "". Beachte dabei das wenn das wort aus einem Buchstaben besteht der Methodenaufruf "s.Substring(1)" einen leeren String zurück gibt und eben KEINE Exception wirft. Wenn das zu ner Exception geführt hätte, würde mann hat s.Substring(0) == s[0].ToString() als Abbruchbedingung nehmen und 1 zurück geben, d.h. den Fall dass der String nur aus seinem Anfangsbuchstaben besteht als trivial betrachten. Bei der Lienarrekursion muss der Rechner nach dem die Abbruchbedingungen "erreicht" worden ist noch die einzelenen Rückgaben der Calls aufaddieren. Somit bleiben Sämtliche Methoden Call im stack und im Arbeitsspeicher muss für jeden Call im Callstack Speicher für zu min. die Paramater reserviert sein. Bei der Endrekursiven Lösung ist das nicht der Fall, das in dem Parameter "Laenge" die Addition erfolgt. Das Problem bei, ich glaub allen objektorientierten Sprachen ist, dass nicht zwichen lienear und Endrekursion unterschieden wird, und somit auch Endrekursiv arbeitende Methoden im Callstack verweilen. Bearbeitet 22. Juni 2010 von Mcolli Zitieren
wolle87 Geschrieben 22. Juni 2010 Autor Geschrieben 22. Juni 2010 Besten Dank für die ausführliche Antwort. Damit komme ich dann wohl weiter Zitieren
lbm1305 Geschrieben 23. Juni 2010 Geschrieben 23. Juni 2010 Moin, ab dem .NET 3.5 gibt es die Möglichkeit, eigene Extension-Methods zu schreiben. public static class StringExtension { public static int MyCount(this string value) { return value.Count(); } } Extension im Einsatz string test = "hallo"; int count = test.MyCount(); // 5 Zitieren
Empfohlene Beiträge
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.