Upload
bamber-stuermer
View
102
Download
0
Embed Size (px)
Citation preview
PKJ 2005/1Stefan Dissmann
Zusammenfassung Vorwoche
Methoden
• sind mit einem Namen versehene Programmabschnitte
• besitzen Rückgabetyp, Namen, Parameterliste und Rumpf
• werden vereinbart mit diesen Angaben
• werden aufgerufen mit Namen und Parametern
PKJ 2005/2Stefan Dissmann
Zusammenfassung Vorwoche
Vereinbarung:public static int mwstVonBetrag(int betrag) {
return betrag*16/116;}
• Bezeichnung in Vereinbarung:formaler Parameter (hier: betrag)
• Rückgabewert: return
• Sonderfälle:• leere Parameterliste = „leere“ Klammern: ()• kein Rückgabetyp: void
PKJ 2005/3Stefan Dissmann
Zusammenfassung Vorwoche
Aufruf:int mwst=0, b=2450;mwst = mwstVonBetrag(b);mwst = mwstVonBetrag(7650);
Bezeichnung in Vereinbarung:aktueller Parameter (hier: b und 7650)
Sonderfälle:• leere Parameterliste = „leere“ Klammern: ()• kein Rückgabewert: keine Zuweisung möglich!
PKJ 2005/4Stefan Dissmann
Methoden (Parameter)
Beispiel:public static void main(String[] args) {
int p=5;m(p);System.out.println(p);
}
public static void m(int p) {p = p++;
}
Was wird ausgegeben?
PKJ 2005/5Stefan Dissmann
Methoden (Parameter)
Fortsetzung Beispiel 1:public static void m1(int p) {
p = p++;}
Bei einfachen Typen als Parameter wird beim Aufruf ein Wert übergeben: Wertübergabe
Daher wahlweise möglich:Übergabe einer Variablen: mwstVonBetrag(b)
oder eines konstanten Wertes: mwstVonBetrag(7650)
PKJ 2005/6Stefan Dissmann
Methoden (Felder als Parameter)
Beispiel (analog zu Beispiel 1):public static void main(String[] args) {
int[] f={5,6,7};m2(f);System.out.println(f[1]);
}
public static void m2(int[] f) {f[1] = 99; // gefährlich!
}
Was wird ausgegeben?
PKJ 2005/7Stefan Dissmann
Methoden (Felder als Parameter)
Fortsetzung Beispiel 2:public static void m2(int[] f) {
f[1] = 99;}
Bei Feldern als Parameter wird beim Aufruf auf das Feld verwiesen (und keine Kopie übergeben): Referenzübergabe
Daraus folgt:Methoden mit Feldern als Parameter können Seiteneffekte außerhalb der Methode erzeugen!
PKJ 2005/8Stefan Dissmann
Methoden (Felder als Parameter - Beispiel) public static void main(String[] args) { int[] feld={11,4,9,34,6,1}; for (int i=0; i<feld.length; i++) System.out.print(feld[i] + ", "); sort(feld); for (int i=0; i<feld.length; i++) System.out.print(feld[i] + ", "); }
public static void sort(int[] f) { for (int i=0; i<f.length; i++) for (int j=0; j<f.length-i-1; j++) if (f[j]>f[j+1]) { int h=f[j]; f[j]=f[j+1]; f[j+1]=h; } }
PKJ 2005/9Stefan Dissmann
Methoden (Felder als Parameter - Beispiel)Frage:
Könnte sort das übergebene Feld auch komplett ersetzen?Etwa in folgender Form:
public static void sort(int[] f) {f = new int[1];f[0] = 99;
}
PKJ 2005/10Stefan Dissmann
Methoden (Felder als Parameter - Beispiel)Analyse:
public static void main(String[] args) { int[] feld={11,4,9,34,6,1};
…sort(feld);…
}
public static void sort(int[] f) {f = new int[1];f[0] = 99;
}
PKJ 2005/11Stefan Dissmann
Methoden (Felder als Parameter - Beispiel)Analyse:
public static void main(String[] args) { int[] feld={11,4,9,34,6,1};
…sort(feld);…
}
public static void sort(int[] f) {f = new int[1];f[0] = 99;
}
11,4,9,34,6,1feld
PKJ 2005/12Stefan Dissmann
Methoden (Felder als Parameter - Beispiel)Analyse:
public static void main(String[] args) { int[] feld={11,4,9,34,6,1};
…sort(feld);…
}
public static void sort(int[] f) {f = new int[1];f[0] = 99;
}
11,4,9,34,6,1feld
f
PKJ 2005/13Stefan Dissmann
Methoden (Felder als Parameter - Beispiel)Analyse:
public static void main(String[] args) { int[] feld={11,4,9,34,6,1};
…sort(feld);…
}
public static void sort(int[] f) {f = new int[1];f[0] = 99;
}
11,4,9,34,6,1feld
f 99
PKJ 2005/14Stefan Dissmann
Methoden (Felder als Parameter - Beispiel)Aber möglich ist natürlich:
public static void main(String[] args) { int[] feld={11,4,9,34,6,1};
…feld = sort(feld);…
}
public static int[] sort(int[] f) {f = new int[1];f[0] = 99;return f;
}
11,4,9,34,6,1feld
f 99
PKJ 2005/15Stefan Dissmann
Rekursive Methoden
In allen Beispielen:Methoden rufen andere Methoden auf!
Besonderer Fall:Eine Methode ruft sich selbst auf!
2 Fragen:•Was geschieht technisch?•Warum sollte man das tun?
PKJ 2005/16Stefan Dissmann
Rekursive Methoden
Was geschieht technisch?
Beispiel:public static void main(String[] args) {
rekAusgabe(3);}
public static void rekAusgabe(int i) {if (i>0) {
rekAusgabe(i-1);System.out.print(i+“ “);
}}
PKJ 2005/17Stefan Dissmann
Rekursive Methoden
Was geschieht technisch?
rekAusgabe(3)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
PKJ 2005/18Stefan Dissmann
Rekursive Methoden
Was geschieht technisch?
rekAusgabe(3)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(2)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
PKJ 2005/19Stefan Dissmann
Rekursive Methoden
Was geschieht technisch?
rekAusgabe(3)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(2)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(1)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
PKJ 2005/20Stefan Dissmann
Rekursive Methoden
Was geschieht technisch?
rekAusgabe(3)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(2)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(1)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(0)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
PKJ 2005/21Stefan Dissmann
Rekursive Methoden
Was geschieht technisch?
rekAusgabe(3)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(2)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(1)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(0)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
PKJ 2005/22Stefan Dissmann
Rekursive Methoden
Was geschieht technisch?
rekAusgabe(3)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(2)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(1)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(0)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
PKJ 2005/23Stefan Dissmann
Rekursive Methoden
Was geschieht technisch?
rekAusgabe(3)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(2)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(1)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(0)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
PKJ 2005/24Stefan Dissmann
Rekursive Methoden
Was geschieht technisch?
rekAusgabe(3)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(2)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(1)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
rekAusgabe(0)
if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }
PKJ 2005/25Stefan Dissmann
Rekursive Methoden
Was geschieht technisch?
public static void rekAusgabe(int i) {if (i>0) {
rekAusgabe(i-1);System.out.print(i+“ “);
}}
Das Beispiel zeigt:• Jede Instanz von rekAusgabe hat ein eigenes i!• Jede Instanz von rekAusgabe hat einen eigenen
„Programmzähler“•Daher arbeiten alle Instanzen voneinander unabhängig!
PKJ 2005/26Stefan Dissmann
Rekursive Methoden
Was geschieht technisch?
public static void rekAusgabe(int i) {if (i>0) {
rekAusgabe(i-1);System.out.print(i+“ “);
}}
Das Beispiel zeigt auch:Damit die rekursiven Aufrufe enden,muss die Methode ein Abbruchkreiterium enthalten!(hier: i>0)
PKJ 2005/27Stefan Dissmann
Rekursive Methoden
Warum sollte man überhaupt mit rekursiven Methoden programmieren?
• Problemstellung ist vorgegeben!• Lösungsidee löst Teilproblem und
reduziert Restaufgabe auf genau die gleiche Problemstellung:
dann kann die Restaufgabe genauso gelöst werden = erneutes Anwendung der Lösungsidee
PKJ 2005/28Stefan Dissmann
Rekursive Methoden
Ein ernsthaftes Beispiel: Berechnung der Quersumme
public static int quersumme(int z) {
}
PKJ 2005/29Stefan Dissmann
Rekursive Methoden
Berechnung der Quersumme:
public static int quersumme(int z) {
z%10
}
Ermitteln der letzten Ziffer!
PKJ 2005/30Stefan Dissmann
Rekursive Methoden
Berechnung der Quersumme:
public static int quersumme(int z) {
z%10 + quersumme(z/10);
}
Rekursion:Problemstellung auf „verkleinertes“ Problem übertragen!
PKJ 2005/31Stefan Dissmann
Rekursive Methoden
Berechnung der Quersumme:
public static int quersumme(int z) { if (z>10) {
return z%10 + quersumme(z/10);
}
}
Festlegen, wann Ergebnis geliefert werden soll!
PKJ 2005/32Stefan Dissmann
Rekursive Methoden
Berechnung der Quersumme:
public static int quersumme(int z) { if (z>10) {
return z%10 + quersumme(z/10);
} else {
return z;
}
}
Und festlegen, was bei Abbruch geschehen soll!
PKJ 2005/33Stefan Dissmann
Rekursive Methoden
Berechnung der Quersumme:
public static int quersumme(int z) { if (z>10) {
return z%10 + quersumme(z/10);
} else {
return z;
}
}