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;
}
}
[/CODE]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;
}
Comments
gimmick
Contributions on this page: 5
View profiledas 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;
}
[/CODE][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;
}
[/CODE]
schneevater
Contributions on this page: 21
View profileDa hast du vollkommen recht. danke
das habe ich garnicht richtig gesehen.. ich glaub ich habe das auf später gelegt... und denn vergessen *g*
schneevater
Contributions on this page: 21
View profileCosinus Annäherung:
[CODE] //Cosinus - berechnen
public double cos(double x, int k){
double erg = 1;
double nenner=1;
double zaehler;
[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;
}
}[/CODE]
schneevater
Contributions on this page: 21
View profileKubikzahlen
[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;
}
}[/CODE]
schneevater
Contributions on this page: 21
View profileZahlenfolgen:
[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));
}[/CODE]
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 ?
SilviaS
Contributions on this page: 2
View profileIch glaube schon ;) Punkt vor Strich ist der Trick.
Viele Grüße,
Silvia
schneevater
Contributions on this page: 21
View profileAchsoooo , meine klammerung war totaler käse *g*
Hab das irgendwie so gesehen, als wäre die minus 2 noch mit unter dem Bruchstrich.
Sollte abends nicht mehr versuchen zu denken ;)
Danke Silvia
gimmick
Contributions on this page: 5
View profileich 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
{
}
schneevater
Contributions on this page: 21
View profile*delete* da falsch
gimmick
Contributions on this page: 5
View profileAlso 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?
schneevater
Contributions on this page: 21
View profileAlso 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
gimmick
Contributions on this page: 5
View profileDanke für die Hilfe - das freut mich doch!
Dann versuche ich mich jetzt mal an den Rekursiven Aufgaben
schneevater
Contributions on this page: 21
View profileJa mach das :)
kannst ja mal schreiben wie lange du so für die Lösung brauchst.
ThomasH69
Contributions on this page: 1
View profile@schneevater:
Bist Du sicher, das Deine Lösung zur Exponentialreihe richtig ist ?
Wenn Du schreibst: zaehler *= zaehler dann bekommst Du m.E. im Zaehler viel zu viel raus weil du den Zaehler immer wieder quadrierst, oder ?
gimmick
Contributions on this page: 5
View profileMeine 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
{
}
schneevater
Contributions on this page: 21
View profile@[COLOR=#1d2a8d][U][COLOR=#1D2A8D][U][URL="https://www.studienservice.de/member.php?u=54864"]ThomasH69[/URL][/U][/COLOR][/U][/COLOR]
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)
schneevater
Contributions on this page: 21
View profileMeine Lösung zu Zahlenfolgen:
[CODE]
public class Zahlenfolgen
{\
}
[/CODE]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;
}
[/CODE]
schneevater
Contributions on this page: 21
View profileHabt ihr eine Rekursive Lösung für die Palindrome ?
Abstrakte Beschreibung wäre :
- als Basisfall ist ein Palindrom wenn text[a] und text[b] 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);
}
}
[/CODE]
schneevater
Contributions on this page: 21
View profile[FONT=monospace]mh ok solang die indizes nicht falsch sind also a=5 und b=2 wer schreibt ist das gut.
So einen richtigen Basisfall hast du hier nicht, dein Basisfall ist quasi alles außer b ist kleiner a, oder?
schneevater
Contributions on this page: 21
View profileAber 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!
szernchen
Contributions on this page: 1
View profileich habe noch einmal eine Frage zu der Sinus Aufgabe.
Warum schreibt ihr bei der Nennerberechnung (2*n) * (2*n + 1); Mir ist noch nicht klar wie ihr von diesen Ausdruck (2n+1)! darauf kommt?
ela-online
Contributions on this page: 5
View profile*delete* weil falsch gedacht
schneevater
Contributions on this page: 21
View profile[CODE]
double nenner=1;
for (int i=1; i <= k; i++){
//nenner berechnen
nenner *= (2*i) * (2*i + 1);
}
[/CODE]
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
ela-online
Contributions on this page: 5
View profileHallo 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
schneevater
Contributions on this page: 21
View profileAlso 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.
ela-online
Contributions on this page: 5
View profileAlso 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.
chris*
Contributions on this page: 2
View profileAlso das tmperg/tmperg sieht schon verdächtig aus. Das ist ja eh immer 1. Was richtig ist oder nicht kann ich nicht sagen, weil ich die Aufgabenstellung nicht kenne.
schneevater
Contributions on this page: 21
View profileUnd Silvias Antwort war:
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.
ela-online
Contributions on this page: 5
View profileDeine 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????
schneevater
Contributions on this page: 21
View profileNe du denkst schon richtig.
Ich hatte zuerst auch deine Klammerung sprich:
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.
ela-online
Contributions on this page: 5
View profileHmm... ok, vielleicht kann Silvia da ja aushelfen
schneevater
Contributions on this page: 21
View profileWobei 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.
chris*
Contributions on this page: 2
View profileWie ist denn die Aufgabenstellung?
SilviaS
Contributions on this page: 2
View profilealso 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.
schneevater
Contributions on this page: 21
View profileDanke für die Aufklärung
Teufael
Contributions on this page: 1
View profileSo.. mein Beitrag zur Exponentialreihe:
und zu den Palindromen:
&
qRekursiv:
qIterativ:
qArray:
bafh2000
Contributions on this page: 3
View profileSorry doppelpost
bafh2000
Contributions on this page: 3
View profileKann es sein, dass deine Kubikzahlen berechnung noch einen Denkfehler hat? 3^3 = 27 und nich wie dein Algoritmus berechnet 36
schneevater
Contributions on this page: 21
View profileHm ne die Aufgabenstellung war:
Die erste Kubikzahl ist 1, die zweite 8, die dritte 27, das in Summe ist 36.
bafh2000
Contributions on this page: 3
View profileStimmt, ich hatte die Fragestellung nicht richtig gelesen. Sorry
stanleyB
Contributions on this page: 1
View profileNoch 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;
}
}[/CODE]
Nur ne Anmerkung. :)
Gruesse,
Johannes
DaHias
Contributions on this page: 3
View profileAnscheinend 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]
DaHias
Contributions on this page: 3
View profileHat da jemand vielleicht nen Vorschlag zur Aufgabe "Rekursive Funktion"?
Ich steh grad bissl aufm Schlauch wie ich auf das t(n/3) + 2 komme...
greenhd01
Contributions on this page: 2
View profile[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;
}[/CODE]
Das ist erstmal die Iterative Lösung
gruß
DaHias
Contributions on this page: 3
View profileAber soll bei t(0) nicht 3 rauskommen?
MarcoK
Contributions on this page: 1
View profileHoffe 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);
}
}[/CODE]
greenhd01
Contributions on this page: 2
View profileSo 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];
}[/CODE]
Stefan77
Contributions on this page: 1
View profileHabe es fast genauso gelöst.\
Alinka
Contributions on this page: 1
View profileLeute!
Suche Diskussion zu Aufgaben:
[URL]https://vu.fernuni-hagen.de/lvuweb/lvuauth/file/FeU/EITech/2010SS/20022/material/ungetaktet/studientag/aufgaben.pdf[/URL]
Könnt ihr helfen?
DANKE
Alinka