Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Klatsch und Tratsch (https://www.delphipraxis.net/34-klatsch-und-tratsch/)
-   -   [Java] Problem mit rekusiver Methode (https://www.delphipraxis.net/164707-%5Bjava%5D-problem-mit-rekusiver-methode.html)

Xzeer 25. Nov 2011 18:20

[Java] Problem mit rekusiver Methode
 
Hallo,

Ich studiere Informatik und heute mussten wir in einem Testat eine rekusive Methode entwickeln, die das hier leistet:

Grundgerüst der Methode:
Code:
public static int b(int[] arr, int i){...}
Aufgabe:
Zitat:

Es soll geprüft werden, ob alle Elemente in arr positiv sind. Wenn ja soll 1 zurückgegeben werden, sonst 0. Die Methode MUSS rekusiv sein und für alle i funktionieren. Wird ein Wert für i übergeben, der außerhalb von arr liegt, soll -1 zurückgeben werden. Die Parameterliste von b DARF NICHT ergänzt werden.
Wie würde eine solche Methode bei euch aussehen?

Meine Lösung (glaube ich nicht ganz richtig):
Code:
public static int b(int[] arr, int i)
    {
        if ((i >= 0) && (i < arr.length))
        {
            if (arr[i] > 0)
            {
                return 1 + b(arr, i + 1);
            }
            else
            {
                return 0;
            }
        }
        else
        {
            if (arr.length > 1)
            {
                return -1;
            }
            else
            {
                return 0;
            }
        }
    }

jaenicke 25. Nov 2011 18:34

AW: [Java] Problem mit rekusiver Methode
 
Was möchtest du denn mit dieser Zeile erreichen? Überlege dir einmal genau was dort passiert...
Code:
return 1 + b(arr, i + 1);
Was du eigentlich willst ist doch an der Stelle 1 zurückzugeben, wenn auch die restlichen Elemente positiv sind. Das musst du dann aber auch prüfen und je nach Rückgabewert den passenden Wert zurückliefern.

Das einfache Addieren wird in der derzeitigen Form nicht funktionieren. Denn dann würdest du z.B. bei einem array mit drei positiven Zahlen 1 + 1 + 1 + (-1) zurückliefern, also nicht 1, obwohl alle drei Werte positiv sind.

Das solltest du am besten einmal im Debugger ausprobieren was passiert.

Xzeer 25. Nov 2011 18:47

AW: [Java] Problem mit rekusiver Methode
 
Das ist mir im Testat dann auch aufgefallen, deshalb ja auch die Ergbniskosmetig im äußersten else-Block. :stupid:
Damit stimmt das Ergebnis dann für b({8}, 0) zum Beispiel wieder...

Ich habe zwar grundlegend einen Ansatz nur fehlt mir ein Teil davon:
Code:
public static int b(int[] arr, int i)
    {
        if ((i >= 0) && (i < arr.length))
        {
            if ((arr[i] > 0) && (na eben der Rest))
            {
                return 1;
            }
            else
            {
                return 0;
            }   
        }
        else
        {
            return -1;
        }
    }
So irgendwie muss das doch klappen, oder?
Nur ich komme nicht drauf, wie ich den Rest ausdrücke... doch nicht als b(arr, i + 1) > 0 :gruebel:

jaenicke 25. Nov 2011 18:58

AW: [Java] Problem mit rekusiver Methode
 
Größer als Null reicht ja nicht, nein. Denn wenn das Array zu Ende ist, kommt ja -1 zurück, auch das wäre ja ok. Wie wäre es also mit "ungleich Null"? ;-)

Xzeer 25. Nov 2011 19:02

AW: [Java] Problem mit rekusiver Methode
 
Nein! :oops:

Ich wusste dass ich nur ein kleines Stück daneben lag, nur wollte mir das einfach nicht einfallen.

Aber vielen Dank für deine Hilfe, jetzt leuchtet es mir ein...

patti 25. Nov 2011 20:32

AW: [Java] Problem mit rekusiver Methode
 
Zitat:

Zitat von Xzeer (Beitrag 1137879)
und für alle i funktionieren

Was genau soll das heißen?

Denn deine Methode (so wie sie jetzt dastehen würde), würde nur für i=0 als Startwert funktionieren, da sonst Elemente ignoriert werden.

Ansonsten kann man das Ganze auch noch ein bisschen zusammenfassen:

Code:
public static int positive(int[] array, int i)
   return (i >= array.length || i < 0) ? -1 : (array[i] > 0 && positive(array, i+1) != 0) ? 1 : 0;
}
:mrgreen:

jaenicke 25. Nov 2011 21:37

AW: [Java] Problem mit rekusiver Methode
 
Wie froh bin ich doch, dass es den Konditionaloperator so in Delphi nicht gibt... ;-)

Das ist wie bei Perl oder anderen absichtlich kryptisch entwickelten Sprachen:
Einmal den Code schreiben und bei nötigen Änderungen geht es schneller es neu zu schreiben als sich in den alten Code einzulesen...

Solche Konstrukte sind nur für Wettbewerbe um den kryptischsten Code oder zum Angeben sinnvoll. ;-)

blackfin 26. Nov 2011 00:07

AW: [Java] Problem mit rekusiver Methode
 
Zitat:

Wie froh bin ich doch, dass es den Konditionaloperator so in Delphi nicht gibt...
Wie unterschiedlich hier Meinungen sein können...der Konditionaloperator ist eines der Features, die ich in Delphi vermisse...ich finde ihn teilweise besser lesbar ein ein Wust aus Klammern oder if-then-elses.
Vor allem in einer IDE mit vernünftigem Syntax-Highlighting hatte ich fast noch nie Probleme, diese ?: Statements zu lesen.
Und zum Angeben taugt der schon gar nicht. Meine Nicht-IT-affine Freundin hat z.B. komischerweise den Konditionaloperator in php eher verstanden als das normale if-klammer-Konstrukt :-)

Zugegebenermaßen ist allerdings die Zeile von patti nicht soooo gut zu lesen :-)..mehrere Konditionaloperatoren in einer Zeile verabscheue ich auch, da trifft das Gesagte von jaenicke dann doch zu :-D

patti 26. Nov 2011 10:35

AW: [Java] Problem mit rekusiver Methode
 
Zitat:

Zitat von blackfin (Beitrag 1137920)
Zugegebenermaßen ist allerdings die Zeile von patti nicht soooo gut zu lesen :-)

War auch nicht 100% ernst gemeint ;)
Aber prinzipiell finde ich die Idee des Operators wirklich an manchen Stellen gar nicht so schlecht ;)

BUG 26. Nov 2011 14:10

AW: [Java] Problem mit rekusiver Methode
 
Zitat:

Zitat von patti (Beitrag 1137944)
Aber prinzipiell finde ich die Idee des Operators wirklich an manchen Stellen gar nicht so schlecht ;)

Die Benennung ist nur etwas kryptisch. In einigen funktionalen Programmiersprachen (afaik Haskell) gibt es einen "if ... then ... else ..."-Operator der so funktioniert. Da ist dieses Konzept völlig einleuchtend.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:39 Uhr.
Seite 1 von 2  1 2      

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