Springe zum Inhalt
DolStudent

Probleme mit rekursiven Funktionen

Empfohlene Beiträge

Hallo Mitstudenten,

das Prinzip der rekursive Funktion habe ich verstanden. Jedoch möchte ich die Problem lösen. Daher benötige ich eure Hilfe:

Mathematik:

An = n2 / 2

Zur Veranschaulichung zeige ich euch:

(An) = 1/2 + 4/2 + 9/2 + 14/2 + .... + (n-2)2/2 + (n-1)2/2 + n2/2

(An-1) = 1/2 + 4/2 + 9/2 + 14/2 + .... + (n-2)2/2 + (n-1)2

Folgend:

An = An-1 + n2/2 für n>1, weil n ist Element von natürliche Zahl, daher ist A0 nicht definiert.

An = 1/2 für n=1

Also habe ich eine Algorithmus entworfen, siehe unten.

Algorithmus:

#include

float bruch_n(int);

float potenz2(float);

void main()

{

int a;

printf("An = n^2/2\n");

printf("N: ");

scanf("%i", &a);

printf("%f \n", bruch_n(a));

}

float bruch_n(int n)

{

if (n==1)

return (1/2);

else

return bruch_n(n-1)+potenz2(n)/2;

}

float potenz2(float n)

{

return n*n;

}

--------------------------------------------

Eingabe: n=5

Ausgabe: 27.0000000

--------------------------------------------

Müsste 27.500000 sein!!

--------------------------------------------

Eingabe: n=4

Ausgabe: 24.5000000

--------------------------------------------

Müsste 25.0000000 sein!!

Irgendwo stimmt das Ergebnis nicht.

Lösung:

Ich könnte 0.5 am Schluß als Notlösung dazuaddieren.

Aber habe ich in der rekursive Funktion was falsches gemacht?

Ich könnte Iteration auch wählen, aber zum verstehen möchte ich Rekursion anwenden.

Vielen Dank für eure Hilfe!

PS: Das habe ich auch im Online Campus der WBH gepostet.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Anzeige: (wird für registrierte Benutzer ausgeblendet)

Hallo DolStudent,

das Problem liegt in der Art und Weise wie du n == 1 behandelst. 1/2 ist eine Integer Division, weil beide Zahlen vom Typ Integer sind. Und 1/2 als Integerdivision ergibt 0. Daher fehlt dir immer 0,5.

Gib einfach den Wert 0.5 zurück und du bekommst das richtige Ergebnis.

Ein Tipp noch, zum Potenzieren kannst du die Funktion pow benutzen, ist in der math.h definiert.

Dein Code mit pow:

#include

#include

float bruch_n(int);

void main()

{

int a;

printf("An = n^2/2\n");

printf("N: ");

scanf("%i", &a);

printf("%f \n", bruch_n(a));

}

float bruch_n(int n)

{

if (n==1)

return 0.5;

else

return bruch_n(n-1)+pow(n,2)/2;

}

Gruß Frank

Bearbeitet von FrankD
Copy & PasteFehler korrigiert

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo Frank,

vielen Dank! Ich werde nach dem Frühstücken es ausprobieren.

Und es auch ausprobieren ob:

return (1.0/2.0) das 0.5 ergibt.

Denn es wäre dann float-Typ.

Mal sehen wie Programm das ausgibt.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen

Kostenlos ein neues Benutzerkonto erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden



×
×
  • Neu erstellen...