Lösungsverschlag zu Aufgaben Rekursion und Iteration

Dr Franke Ghostwriter
Hier meine Lösung für die Exponentialreihe iterativ :

Code:
public class exponentialreihe
{
  //iterative berechnung exponentialreihe
  public double exp(double x, int k) {
      //Initialisierung vars
      double zaehler = 1.0;
      double nenner = 1;
double erg = 0;
 
// e hoch 0 ist immer 1      
      if (k == O) {
          return 1;
      }
 
      //solange i kleiner gleich k, summiere Summanden bestehend aus Brüchen
      for (int i=0; i <= k; i++) {
          if (i == 0) {
            nenner *= 1;
          }
          else {
            nenner *= i;
          }
          if (i != 0) {
            zaehler *= x;
          }
 
          erg += zaehler / nenner;
        }
 
        return erg;
    }
}
Nachdem ich es denn eingegeben hatte das und mir aufgefallen war, dass 0! ja gleich 1 ist und es ohne die if immer unendlich wäre ....
man kann sich an kleinen sachen schon gut aufhängen..


Sinus annäherung:


//Sinus - berechnen
public double sin(double x, int k){
double zaehler;
double nenner=1;
double erg=x;

//sinus von 0 ist 0
if (x == 0) {
return 0;
}

for (int i=1; i <= k; i++){
zaehler =x;
//definiere den zähler, nach der regel i*2+1
for (int j=2; j <= i*2+1; j++) {
zaehler *= x;
}
//nenner berechnen
nenner *= (2*i) * (2*i + 1);;
//wenn i gerade wird addiert, wenn ungerade wird subtrahiert
if (i % 2 == 0) {
erg += zaehler / nenner;
}
else {
erg -= zaehler / nenner;
}
}
return erg;
}
 
das Forum unterstützt die Darstellung von Code und einrückungen machen es wirklich viel einfacher Code nachzuvollziehen.

Einfach das Programm in einen [ CODE]...Programm...[ /CODE] Block schreiben.

Code:
public class exponentialreihe
{
    //iterative berechnung exponentialreihe
    public double exp(double x, int k) {
        //Initialisierung vars
        double zaehler = x;
        double nenner = 1;
        double erg = 0;

        // e hoch 0 ist immer 1
        if (x == O) {
            return 1;
        }

        //solange i kleiner gleich k, summiere Summanden bestehend aus Brüchen
        for (int i=0; i <= k; i++) {
            if (i == 0) {
                nenner *= 1;
            }
            else {
                nenner *= i;
            }
            zaehler *= zaehler;

            erg += zaehler / nenner;
        }

        return erg;
    }
}
Code:
//Sinus - berechnen
public double sin(double x, int k){
    double zaehler;
    double nenner=1;
    double erg=1;
    
    //sinus von 0 ist 0
    if (x == 0) {
        return 0;
    }
    
    for (int i=1; i <= k; i++){
        zaehler =x;
        //definiere den zähler, nach der regel i*2+1
        for (int j=2; j <= i*2+1; j++) {
            zaehler *= x;
        }
        //nenner ist fakultät
        nenner *= i;
        //wenn i gerade wird addiert, wenn ungerade wird subtrahiert
        if (i % 2 == 0) {
            erg += zaehler / nenner;
        }
        else {
            erg -= zaehler / nenner;
        }
    }
    
    return erg;
    
}
 
Cosinus Annäherung:
Code:
    //Cosinus - berechnen
    public double cos(double x, int k){
        double erg = 1;
        double nenner=1;
        double zaehler;

        for (int i=1; i <= k; i++){
            zaehler =x;
            //definiere den zähler, nach der regel i*2
            for (int j=2; j <= i*2; j++) {
                zaehler *= x;
            }
            //berechne nenner
            nenner *= (i+1) * (2*i);

            //wenn i gerade wird addiert, wenn ungerade wird subtrahiert
            if (i % 2 == 0) {
                erg += zaehler / nenner;
            }
            else {
                erg -= zaehler / nenner;
            }
        }        
        return erg;        
    }
Summen ungeraden / gerader Zahlen einschließlich n
Code:
public class Zahlensummen
{
    //summe ungerade zahlen - rekursiv   
    public long berechneSummeUngeraderZahlen(int n) {
        //Basisfall
        if (n == 0) {
            return 0;
        }
        else {
            //rekursive aufrufe
            if (n % 2 == 1) {
                return n + berechneSummeUngeraderZahlen(n-1);
            }
            if (n % 2 == 0) {
                return  0 + berechneSummeUngeraderZahlen(n-1);
            }
        }
        return 0;
    }

    //summe gerade zahlen - rekursiv   
    public long berechneSummeGeraderZahlen(int n) {
        //Basisfall
        if (n == 0) {
            return 0;
        }
        else {
            //rekursive aufrufe
            if (n % 2 == 0) {
                return n + berechneSummeGeraderZahlen(n-1);
            }
            if (n % 2 == 1) {
                return  0 + berechneSummeGeraderZahlen(n-1);
            }
        }
        return 0;
    }
    
    //summe gerade zahlen - iterativ   
    public long berechneSummeGeraderZahlen_it(int n) {
        long erg=0;
        if (n == 0 || n == 1) {
            return 0;
        }
        for(int i = 2; i <= n; i++) {    
            if (i % 2 == 0) {
                erg += i;
            }
        }
        return erg;
    }
    
    
}
 
Kubikzahlen
Code:
public class Kubikzahl
{
    public long berechneSummeKubikZahlRekursiv(int n) {
        //Basisfall
        if (n == 0) {
            return 0;
        }
        //rekursiver Aufruf
        return (n * n * n) + berechneSummeKubikZahlRekursiv(n-1);        
    }
    
    public long berechneSummeKubikZahlIterativ(int n) {
        long erg = 0;      
        //falls n = 0, gege 0 zurück
        if (n == 0) {
            return 0;
        }
        //von 1 bis einschließlich n, summiere i hoch 3 
        for (int i=1; i <= n; i++){
            erg +=  i * i * i;
        }
        
        return erg;
    }
}
 
Zahlenfolgen:

Code:
    public double qRekursiv(double x, int n) {
        //Basisfall
        if (n == 0) {
            return x;     
        }
        //rekursiver Aufruf  
        return (3.0 * qRekursiv(x, n-1) / qRekursiv(x, n-1) - 2.0 ) + (x * qRekursiv(x, n-1));
    }

nur irgendwie steh ich bei der Zahlenfolge auf dem schlauch...
bei 2 , 0 ist Ergebnis : 2 das ist verständlich da n == 0 ja return x
bei 2, 1 ist das Ergebnis: 5

ich würde da folgendes errechnen: (3 * 2 / 2-2 ) + 2 * 2 und wäre ja eine Division durch 0 dabei. Daher kann ich gerade das Ergebnis nicht nachvollziehen.

Kann mir da einer auf die Sprünge helfen ?
 
ich habe mich an der Sinus Methode auch mal versucht und bekomme andere Ergebnisse als du.

Kann mich jemand auf meinen Fehler hinweisen?



/**
* Write a description of class Sinus here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Sinus
{

public Sinus()
{
System.out.println("Ergebnis: " + sin(10, 2));
}
/**
* Methode zur Berechnung der Sinus Funktion
* @param x double Wert
* @param k int Wert (Anzahl der Summen foo bar)
* @return double Wert der Berechnung
*/
public double sin(double x, int k)
{
double ergebnis = 0.0; // Ergebnisvariable

// Prüfen auf Abbruchbedingung ^0
if ( x == 0 )
{
return 0; // Sinus von 0 ist 0
}

for ( int i = 0 ; i <= k; i++) // Berechnung für k Schritte
{
// Belegung von Hilfsvariablen für Zwischenwerte
double z1 = -1.0;
double z2 = 1.0;
double z3 = 1.0;

// Berechnung des ersten Teilausdrucks (-1)^n
for ( int j = 0; j <= i; j++)
{
z1 *= -1.0;
}

// Berechnung des zweiten Teilausdrucks x^2*n+1
for ( int m = 1; m <= 2*i+1; m++)
{
z2 *= x;
}

int nenner = 2*i+1; // Berechnung des Fakultätausdrucks

// Berechnung des dritten Teilausdrucks (2*n+1)!
for ( int n = nenner; n > 0; n--)
{
z3 = z3 * n;
}

// Ermitteln des Zwischenergebnis für den i-ten Schritt
ergebnis += z1 * (z2 / z3);
}
// Rückgabe des Ergebnis
return ergebnis;
}
}
 
Also bei 10, 2 als Parameter für die Methode wird an der Stelle folgendes berechnet:

Nenner: 1
Berechne: 1.0 * 1
Nenner: 3
Berechne: 1.0 * 3
Berechne: 3.0 * 2
Berechne: 6.0 * 1
Nenner: 5
Berechne: 1.0 * 5
Berechne: 5.0 * 4
Berechne: 20.0 * 3
Berechne: 60.0 * 2
Berechne: 120.0 * 1

Das ist doch richtig, oder?
 
Also ich würd sagen deins ist komplett richtig.
denke eher das ich da noch einen fehler drin hatte und das Ergebnis immer mit x zuwenig ist.
da ich :
double erg=1;
setze und die schleife denn von 1 laufen lassen.
daher muss ich die Variable erg wohl so initialisieren :
double erg=x;
denn haben wir beide das gleiche. müsste wirklich so stimmen
 
Meine Lösung für die Exponentialreihe:


/**
* Write a description of class FooBar here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class FooBar
{

public FooBar()
{
System.out.println("Rückgabe von exp: " + exp(10, 3));
}

public double exp(double x, int k)
{
if (x <= 0 || k < 0)
{
System.out.println("Illegale Eingabe");
return 0.0;
}
if (k == 0)
{
return 1.0;
}
double ergebnis = 0;
for ( int i = 1; i<=k; i++)
{
double zaehler = 1.0;
int nenner = 1;
for ( int j = 1; j<=i; j++)
{
zaehler = zaehler * x;
}
for ( int q = i; q > 0; q--)
{
nenner = nenner * q;
}
ergebnis += zaehler / nenner;
}
return ergebnis;
}
}
 
@ThomasH69
Sicher war ich mir nie, daher poste ich die als Vorschlag damit ich denn auch weiß ob ich was richtig oder falsch habe, daher bin ich für alle Korrekturen offen.
Habe gerade bei den ersten Aufgaben gerne die gleichen Fehler gemacht wie ich sehe.
Ich wollte es geschickt machen und Zaehler direkt schon auf x setzen für den ersten schritt was natürlich Quark ist. Irgendwas hoch 0 ist immer 1...

Ich habs oben in der Lösung nun auch geändert.


Du hast recht richtiger wäre wohl
Initialisierung: double zaehler = 1.0;
Berechnung Zaehler: zaehler *= x; (außer wenn i = 0 ist)
 
Meine Lösung zu Zahlenfolgen:
Code:
public class Zahlenfolgen
{
    

    public double qIterativ(double x, int n) {
        double tmperg = x;
        //wenn n gleich 0 gebe direkt x aus
        if (n == 0) {
            return x;
        }
        
        //berechne folge iterativ
        for (int i=1; i <= n; i++){           
            tmperg = 3.0 * tmperg / tmperg - 2+ x * tmperg;     
        }
        return tmperg;
    }

    public double qRekursiv(double x, int n) {
        //Basisfall
        if (n == 0) {
            return x;     
        }
        //rekursiver Aufruf  
        return ((3.0 * qRekursiv(x, n-1) / qRekursiv(x, n-1)) - 2.0 ) + (x * qRekursiv(x, n-1));
    }

    
    
    public double[] qArray(double x, int n){
        double[] ergArray = new double[n+1];
        double tmperg = x;
        //berechne folge iterativ
        for (int i=0; i <= n; i++){           
            if (i == 0) {
                ergArray[0] = x;
            }
            else {
            tmperg = 3.0 * tmperg / tmperg - 2+ x * tmperg;
            ergArray[i] = tmperg;
            }
        }
      
        return ergArray;
    }
    
}
Lösung zu Palindrome iterativ:

Code:
public class Palindrome
{
    public boolean pruefePalindromIterativ(char[] text, int a, int b){
        //Exception erstellen wenn index wert b größer = text länge, oder b - a kleiner gleich 0
        if ( b-a <= 0 || text.length <= b || a < 0 || b < 0) {
            throw new IllegalArgumentException("Falsche Indexwerte!");
        }
        for (int i = 0; a+i < b-i; i++) {
           if (text[a+i] != text[b-i]) {
               return false;
           }
        }
        return true;
    }
 
Habt ihr eine Rekursive Lösung für die Palindrome ?

Abstrakte Beschreibung wäre :
- als Basisfall ist ein Palindrom wenn text[a] und text gleich sind sowie die Länge des text Feldes nicht größer 3 ist also xx oder aXa
- ansonsten muss es rekursiv geprüft werden ob text[a+1] == text[b-1], solange bis a+1 == b - 1 ist
also bei :
0 1 2 3 4
x x a x x
0 == 4
1 == 3
2
a+1 == b -1 -> 2 == 2
dies noch prüfen und denn stopp

Code:
    public boolean pruefePalindromRekursiv(char[] text, int a, int b){
        //Basisfall 
        if ( text[a] == text[b] && a+1 == b-1) {
            return true;
        }
        //rekursiver Aufruf
        else {
            return pruefePalindromRekursiv(text, a+1, b-1);
        }
        
    }
 
Aber nun weiß ich warum ich mich so schwer getan habe... einen boolean kann ich mit einem vergleich übergeben a == b ich hatte immer ein true bzw. false übergeben wollen...
aber so wird es natürlich implizit übergeben und das ist auch eigentlich ziemlich leicht wenn mans mal verstanden hat.

dank dir kiomi!
 
Code:
 double nenner=1;

 for (int i=1; i <= k; i++){
        //nenner berechnen
        nenner *=  (2*i) * (2*i + 1);
 }
Also es soll dieser Ausdruck erreicht werden: (2n+1)!
bei n = 0 wird dies zu : 2*0 +1 = 1! = 1
bei n = 1 : 2*1 +1 = 3! = 3*2*1
bei n = 2 : 2*2 +1 = 5! = 5 * 4 * 3 * 2 *1

0! ist definiert als 1


die For- Schleife beginnt bei 1 und nenner wurde vorher auf 1 gesetzt
bei 1: 1 *= (2*1) * (2*1 +1) => 1* = 2 * 3 => 3 * 2 * 1
bei 2: 6 *= (2*2) * (2*2 +1) => 6* = 4 * 5 => 6 * 4 * 5

es hilft hierbei wirklich sich das schritt für schritt einmal aufzuschreiben,
so kann man überprüfen ab nicht wirklich eine multiplikation fehlt.
Das war der Fehler den ich zuerst gemacht hatte.

Ich hoffe das hilft etwas
 
Meine Lösung zu Zahlenfolgen:
Code:
public class Zahlenfolgen
{
 
 
    public double qIterativ(double x, int n) {
        double tmperg = x;
        //wenn n gleich 0 gebe direkt x aus
        if (n == 0) {
            return x;
        }
 
        //berechne folge iterativ
        for (int i=1; i <= n; i++){           
            tmperg = 3.0 * tmperg / tmperg - 2+ x * tmperg;     
        }
        return tmperg;
    } 
 
 
 
}

Hallo zusammen,
irgendwie häng ich gerad bei den Zahlenfolgen und kann auch dem Code von Schneevater nicht folgen. Also verstehen tue ich den Code, aber irgendwie versteh ich die Formel an sich glaub ich nicht ganz. Müssen bei der iterativen Lösung nicht zumindest irgendwelche Klammern in die Berechnung von tremperg?

Kann mir die Aufgabe vielleicht einer grob erklären?

Schöne Grüße und weiterhin frohes Schaffen 🙂
ela
 
Also es sei x = 2 und n = 3

tmperg wird auf x gesetzt, da laut definition q0 (also bei eingabe von x = 2 und n = 0),
das ergebnis x lauten soll.

Die ganze Formel sieht ja so aus, dass der Folgewert berechnet wird in dem das Vorgängerergebnis mit eingerechnet wird (n-1 ist der Verweis auf den Vorgänger).

Daher ist wenn man die Vorschleife betrachtet:
bei i = 1:
tmperg = 3.0 * 2 / 2 - 2 + 2 * 2 => 6 / 2 - 2 + 4 => 3 - 2 + 4 => 5
bei i = 2:
tmperg = 3.0 * 5 / 5 - 2 + 2 * 5 => 15 / 5 - 2 + 10 => 3 - 2 + 10 => 11
bei = 3:
tmperg = 3.0 * 11 /11 - 2 + 2 * 11 => 33 / 11 - 2 + 22 => 3 - 2 + 22 => 23

Das ganze funktioniert deswegen ohne Klammern da Punkt vor Strich gilt. Wie Silvia mir auch den Hinweis gegeben hat.

Ich hatte den Nenner ja auch immer falsch gerechnet und -2 direkt gemacht das ist aber falsch.
 
Also soweit erstmal danke für die erklärung... trotzdem ist mir das mit den klammern nicht klar...
bei i = 1:
tmperg = 3.0 * 2 / 2 - 2 + 2 * 2 => 6 / 2 - 2 + 4 => 3 - 2 + 4 => 5

ich würde aber sagen, es muss heißen:
tmperg = (3.0 * 2 )/( 2 - 2) + 2 * 2 usw...
denn die - 2 stehen mit im nenner und nicht daneben. und für x = 2 hätte man dann division durch null, was nicht geht.
 
ich würde da folgendes errechnen: (3 * 2 / 2-2 ) + 2 * 2 und wäre ja eine Division durch 0 dabei. Daher kann ich gerade das Ergebnis nicht nachvollziehen.

Kann mir da einer auf die Sprünge helfen ?
Und Silvias Antwort war:
Ich glaube schon 😉 Punkt vor Strich ist der Trick.

Viele Grüße,
Silvia
Das ganze hatte mich auch verwirrt. Vorallem da ich es in BlueJ auch getestet hatte und dort auch das Ergebnis in dem Fall 5 war, konnte ich die Rechenschritte nicht nachvollziehen.
Aber wenn man wirklich stur Punkt vor Strich macht geht die Aufgabe.

Aber die Aufgabe hätte sonst keinen Sinn wenn es nicht Punkt vor Strich wäre, da es sonst wirklich eine Division durch 0 geben würde und daher nicht lösbar wäre.

Bei der Rekursiven Lösung habe ich auch Klammern gesetzt, aber im Endeffekt ist es nur dafür man es selbst besser lesen kann.
 
Deine Klammerung ist anders als meine, auch wenn du im Kopf wahrscheinlich gleich gedacht hast... Es werden erst die Klammern berechnet und halt Punkt vor Strich. Klammern dienen nicht immer nur der besseren Lesbarkeit, sondern man muss sie zuerst berechnen. Und in den Klammern gilt natürlich auch Punkt vor Strich.

meine: (3.0 * 2 )/( 2 - 2) + 2 * 2 = geht nicht, weil durch Null
deine: (3 * 2 / 2-2 ) + 2 * 2 = 5 =>wenn das so richtig geklammert ist, dann stimmt das doch nicht mit dem term aus der formel überein...

Oder wo denk ich wieder falsch????
 
Ne du denkst schon richtig.
Ich hatte zuerst auch deine Klammerung sprich:
meine: (3.0 * 2 )/( 2 - 2) + 2 * 2
nur am Beispiel x = 2 sieht man hier eine Polstelle.

Wenn die Formel so bleiben soll und das von Silvia beabsichtigt war muss man bei x = 2 eine Exception werfen. Bei allen andere Zahlen funktionert die Formel ja.

Ich hatte es nur angepasst und direkt in BlueJ mal ohne Klammerung probiert, da ja ein Algorhitmus normalerweise allgemein gültig sein sollte.Daher habe ich die Version in der eine Division durch Null auftritt als unwahrscheinlich ausgeschlossen.

Ist also wohl eher Definitionssache von der Formel betrachtet in der Aufgabestellung habe ich das -2 auch im Nenner gesehen.
Müsste uns Silvia also erhellen.
 
Wobei eine Exception bei x = 2 nicht reichen würde da ja evt. eine Berechnung auch ein Ergebnis von 2 liefert und dabei denn die nachfolgende Berechnung ebenfalls eine Division durch Null erzeugt.

Ich kann mir daher nicht vorstellen, dass es so beabsichtigt war.
 
Wobei eine Exception bei x = 2 nicht reichen würde da ja evt. eine Berechnung auch ein Ergebnis von 2 liefert und dabei denn die nachfolgende Berechnung ebenfalls eine Division durch Null erzeugt.

Ich kann mir daher nicht vorstellen, dass es so beabsichtigt war.

also zu der ganzen Thematik. Die ursprüngliche Frage habe ich nicht im Kontext der Aufgabe gesehen, sorry und deswegen auch die Klammerung nicht weiterüberprüft.

Also bei der Aufgabe kann es zu einer Division durch 0 kommen. Das kann man entweder immer vorher abprüfen oder man lässt es einfach zu der Ausnahme kommen, da ja dann das gewünschte Glied nicht berechnet werden kann. Nachdem aber Ausnahmebehandlung nicht Ziel der Aufgaben ist, kann man das Problem getrost ignorieren. Aber die -2 gehört so wie die Formel es sagt mit unter den Bruchstrich, d.h. die Differenz muss geklammert werden.

Ich hoffe das klärt alle Ungereimtheiten. Das ganze sollen ja auch "nur" Übungsanregungen sein, also keine Sorge, dass so etwas in der Klausur auftaucht. Ich wollte nur die Formel auch nicht zu einfach gestalten 😉

Viele Grüße,
Silvia

PS: Der Mailserver bereitet zur Zeit Probleme, so dass ich nicht an meine Mails komme, also nicht wundern, wenn keine Antwort kommt, sobald wieder alles geht, werde ich antworten.
 
So.. mein Beitrag zur Exponentialreihe:


public double exp(double x, int k) {
double erg = 1;
double zaehler = 1.0;
for(int i = 0; i < k; i++) {
double nenner = 1.0;
zaehler *= x;
for(int l = 1; l <= (i + 1); l++) {
nenner *= (double) l;
}
erg += zaehler / nenner;
}
return erg;
}
und zu den Palindromen:

public boolean pruefePalindromRekursiv(char[] text, int a, int b) {
if(b <= a)
{
return true;
} else if(text[a] != text)
{
return false;
}
return pruefePalindromRekursiv(text, a + 1, b - 1);
}
&

public boolean pruefePalindromIterativ(char[] text, int a, int b)
{

while(a < b) {
if(text[a] != text) {
return false;
}
a++;
b--;
}
return true;
}
qRekursiv:

public double qRekursiv(double x, int n) {
// qn = ((3*qn-1)/(qn-1-2)+x*qn-1)
if(n <= 0) {
return x;
} else if(x == 2) {
return x * qRekursiv(x, n - 1);
}
return (3 * qRekursiv(x, n - 1)) / (qRekursiv(x, n - 1) - 2) + x * qRekursiv(x, n - 1);
}
qIterativ:

public double qIterativ(double x, int n) {
if(n <= 0) {
return x;
}
double qnone = (3 * x) / (x - 2) + x * x;
for(int i = 1; i < n; i++) {
qnone = (3 * qnone) / (qnone - 2) + x * qnone;
}
return qnone;
}
qArray:

public double[] qArray(double x, int n) {
double[] rueckgabe = new double[n];
for(int i = 0; i < n; i++) {
rueckgabe = qRekursiv(x, (i+1));
}
return rueckgabe;
}
 
Kubikzahlen
Code:
public class Kubikzahl
{
    public long berechneSummeKubikZahlRekursiv(int n) {
        //Basisfall
        if (n == 0) {
            return 0;
        }
        //rekursiver Aufruf
        return (n * n * n) + berechneSummeKubikZahlRekursiv(n-1);        
    }
    
    public long berechneSummeKubikZahlIterativ(int n) {
        long erg = 0;      
        //falls n = 0, gege 0 zurück
        if (n == 0) {
            return 0;
        }
        //von 1 bis einschließlich n, summiere i hoch 3 
        for (int i=1; i <= n; i++){
            erg +=  i * i * i;
        }
        
        return erg;
    }
}
Kann es sein, dass deine Kubikzahlen berechnung noch einen Denkfehler hat? 3^3 = 27 und nich wie dein Algoritmus berechnet 36
 
Noch mal kurz vor der Klausur ueber den Thread hier gestolpert, um meine Loesungen mit euren zu vergleichen - alles wunderbar. Allerdings sind vorgestellte Palindrome-Loesungen nicht Case-Sensitive. Bei Palindromen wie ["Anna" oder ["Lagerregal" wuerden viele Loesungen aus dem Thread scheitern.
Beim Vergleich der chars ueber die statische [Character.toUpperCase(char) oder [Character.toLowerCase(char) Methode rutschen und schon koennen einem unterschiedliche Cases auch egal sein.

Code:
    public boolean pruefePalindromRekursiv(char[] text, int a, int b)
    {
  
        if (b <= a)
        // Basisfall
        {
            return true;
        }
        else
        // Rekursionsfall
        {
            return (Character.toUpperCase(text[a]) == Character.toUpperCase(text[b])) ?
                    pruefePalindromRekursiv(text, ++a, --b) :
                    false;
        }
    }

Nur ne Anmerkung. 🙂

Gruesse,
Johannes
 
Anscheinend gabs diese Aufgabe bis jetzt noch nicht, daher stell ich die noch dazu:

Code:
public long multipliziere (long a, long b) throws IllegalArgumentException {
        
        if (a < 0 | b < 0) {
            throw new IllegalArgumentException();
        }
        
        if (b == 0) {
            return 0;
        }
        
        return a + multipliziere (a, b-1);
    }
 
Code:
     /**
     * Berechnet Iterativ eine gegebene Funktion
     * @param n Erwartet einen integer wert >0
     */
    public long tIterativ(int n)
    {
        //Initialisiert eine Variable in der gezählt wird setzt gleichzeitig t(0) auf 0
        long ausgabe=0; 
        //Prüft ob eingabedaten Korrekt sind
        if(n<0)
        {
            System.out.println("Falsche Eingabe!");
        }
        //For Schleife die aufsteigend Iteriert bis i<n+1
        for(int i=1; i<n+1;i++)
        {
            //Prüft ob i durch 3 teilbar ist
            if(i%3==0)
            {
                // Setzt die ausgabe auf t(n/3)+2
                ausgabe= (i/3)+2;
            }
            
            else
            {
                // Setzt die Ausgabe auf 2*t(n-1)
                ausgabe=2*ausgabe;
            }
        }
        //Liefert das Ergebnis
        return ausgabe;
    }

Das ist erstmal die Iterative Lösung

gruß
 
Hoffe das ist richtig:

Code:
Code:
public long tRekursiv(int n)
    {
      
        if(n<0)
        {
           throw new IllegalArgumentException
        }
       //Basisfall
       if(n<=3)
        {
           return 3;
        }
       //Weitere Unterscheidung nach Teilbar durch 3
      if(n%3==0)
      {
         return tRekursiv(n/3)+2;
      }
      else
      {
        return 2* tRekursiv(n-1);
      }
    }
 
So hab mir das eben doch nochmal angeguckt find ich bischen blöd definiert 🙂. Liefert jetzt für alles <=3 gleich 3 zurrück und fängt erst ab 4 beim Schleifendruchlauf an

Code:
    /**
     * Berechnet Iterativ eine gegebene Funktion
     * @param n Erwartet einen integer wert >0
     */
    public long tIterativ(int n)
    {
        //Initialisiert eine Variable in der gezählt wird setzt gleichzeitig t(0) auf 0
        int[] test = new int[n+1];
        for(int i=0; i<=3; i++)
        {
            test[i]=3;
        }
            
        //Prüft ob eingabedaten Korrekt sind
        if(n<0)
        {
            System.out.println("Falsche Eingabe!");
        }
        //For Schleife die aufsteigend Iteriert bis i<n+1
        if(n<=3)
        {
            return 3;
        }
        for(int i=4; i<n+1;i++)
        {
            //Prüft ob i durch 3 teilbar ist
            if(i%3==0)
            {
                // Setzt die ausgabe auf t(n/3)+2
                test[i-1]=test[(i-1)/3]+2;
            }
            
            else
            {
                // Setzt die Ausgabe auf 2*t(n-1)
                test[i-1]=2*test[i-2];
            }
        }
        //Liefert das Ergebnis
        return test[n-1];
    }
 
Anscheinend gabs diese Aufgabe bis jetzt noch nicht, daher stell ich die noch dazu:

Code:
public long multipliziere (long a, long b) throws IllegalArgumentException {
 
if (a < 0 | b < 0) {
throw new IllegalArgumentException();
}
 
if (b == 0) {
return 0;
}
 
return a + multipliziere (a, b-1);
}

Habe es fast genauso gelöst.

public
long multipliziere(long a, long b) throws IllegalArgumentException {


if (a < 0 | b < 0) {
thrownew IllegalArgumentException();
}




if(a==1) {
return b;
}else{
return b+(multipliziere(a-1,b));
}



}
 
Oben