Forum: PC-Programmierung Probleme bei Potenz Rekursion c++


von Kurt T. (kurtisblow)


Lesenswert?

Hallo, ich habe ein problem bei der Potenzbildung m.h.e Rekursion.
Die postivien Potenzen funktionieren schon, jedoch wenn ich z.B 3.0^(-6)
rechnen will klappt es nicht. Kann mir jemnad helfen?
Bisher habe ich folgenden Code:
1
#include <iostream>
2
#include <cmath>
3
4
using namespace std;
5
6
double foo (double,int );
7
8
int main() {
9
    double d = 3.0;
10
    int e = -2;
11
    int rwert = foo(d,e);
12
    cout << rwert;
13
    cin.get();
14
    return 0;
15
}
16
17
double foo (double a, int b) {
18
    if (b == 0) return 1.0;
19
    double c = 1.0;
20
21
   if (b >0 ) {
22
    double c = foo (a,b/2);
23
    c =c*c;
24
    if (b % 2 != 0) c= a*c;
25
    return c;
26
   }
27
   if (b <0 ) {
28
    double c = foo (a,b/2);
29
    if (b % 2 != 0) c= 1/(a*c);
30
    return c;
31
   }
32
}

von Klaus W. (mfgkw)


Lesenswert?

naja, bei 3^6 musst du 5 Rekursionsschritte ausführen, bei 3^10 9 
Schritte, bei 3^15 14 Schritte.
Also bei 3^-6 sind es wieviele?

von Yalu X. (yalu) (Moderator)


Lesenswert?

rwert ist vom Typ int. Wie soll damit das Ergebnis 0.111111
dargestellt werden?

Für den Fall des negativen Exponenten hast du vergessen, c zu
quadrieren.

Außerdem muss in der viertletzten Zeile c=c/a statt c=1/(a*c)
stehen. Dann tut's.

@Klaus Wachtler:
Nee, das funktioniert etwas anders. War aber auch schon spät ;-)

von Klaus W. (mfgkw)


Lesenswert?

Ok, beim nächsten Mal schaue ich auf die Uhr :-(

von Rolf Magnus (Gast)


Lesenswert?

Besser wäre es, auf den Code zu schauen :-P
SCNR

von Klaus W. (mfgkw)


Lesenswert?

Möchtest du jetzt noch etwas Salz und Pfeffer zum Draufstreuen?

von Purzel H. (hacky)


Lesenswert?

Man kann ja eine Potenz als Uebungsbeispiel per Rekursion loesen, aber 
in Wirklichkeit ist eine Schleife besser.

von Karl H. (kbuchegg)


Lesenswert?

Solche Beispiele sind praktisch immer Übungsbeispiele um rekursives 
Denken zu trainieren und sind als solche für den praktischen Einsatz 
nicht zu gebrauchen.

PS: Ich würde mich im Falle eines negativen Exponenten einfach strikt an 
die Defintion halten:   a^-b = 1 / a^b
und das dann auch so programmieren

   ...
   else if( b < 0 ) {
     double c = foo( a, -b );
     return 1/c;
   }
   ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.