Benutzer mit den meisten Antworten
Potenz

Frage
-
Hallo
Kann mir bitte jemand helfen und mir erklaren wie die vorletzte Zeile genau funktioniertreturn (number * GetPower(number,power-1));
wie und was rechnet er hier " GetPower(number,power-1)"
Also man nimmt irgenteine zahl(zb 2) und multipliziuert es mit GetPower das aus number also aus 2 und power(zb4)-1 weiter verstehe ich nicht....am ende kommt 16 raus.
das(number,power-1) ist doch uberhaupt keine rechnung !?
Ich Hoffe ihr Versteht meine frage.Kompletter Code:
#include <iostream> #include <tchar.h> using namespace std; typedef unsigned short USHORT; typedef unsigned long ULONG; ULONG GetPower(USHORT n, USHORT power); int main() { USHORT number, power; ULONG answer; cout << "Geben Sie eine Zahl ein: "; cin >> number; cout << "Zu welcher Potenz? "; cin >> power; answer = GetPower(number,power); cout << number << " hoch " << power << "ist gleich " <<answer << endl; system("PAUSE"); return 0; } ULONG GetPower(USHORT number, USHORT power) { if(power == 1) return number; else return (number * GetPower(number,power-1)); }
Antworten
-
Hallo, ich kann zwar kaum C++ aber rein von der Funktionalotät rechnet dir GetPower die Potenz einer Zahl aus. Kurz gesagt, das was pow in C++ schneller hinbekommen würde. Es werden 2 Zahlen übergeben. In meinem Beispiel a (2) und b (3).
- b (3) ist nicht 1
- gebe a(2) *
GetPower(a (2), b (3) - 1) zurück
- b‘ (2) ist nicht 1
- gebe a(2) *
GetPower(a(2), b‘(2) – 1) zurück
- b‘‘ (1) ist 1
- gebe a zurück
- ergebnis = 2
- ergebnis = 4
- ergebnis = 8
Oder kurz: Man multipliziert a mit sich selbst und pro durchgang wird b um 1 erniedrigt bis b 0 ist.
Die von dir angesprochene, vorletzte Zeile gibt also nur das Ergebnis der 1 Grad kleineren Potenz mal die Basis zurück.
PS: pow geht garantiert schneller, als ein rekursiver Aufruf einer Funktion.
Koopakiller - http://koopakiller.ko.ohost.de/
- Als Antwort markiert Strean Sonntag, 4. November 2012 00:18
-
Das ist eine einfache Rekursion... das heisst, die Funktion ruft sich selber auf
Anmerkung am Rande: das kann sehr gefährlich sein, Stichwort "stack overflow" und ausserdem finde ich das sehr ineffizient, weil "calls" immer ineffizient sind... viel ineffizienter als "normale jumps".
Die Idee der Rekursion ist eigentlich selbsterklärend und im Grunde müsste man da auch ohne Erklärung drauf kommen können...
Trotzdem mal eine Ausführung:
Was du tun willst ist z.B. 4 hoch 8 ausrechnen (ich schreibe das 4^8). Wenn du das zerlegst ist das 4 * 4^7 ... und 4^7 wiederum ist 4 * 4^6 ... das geht dann weiter bis 4^1, was 4 ist... daher das "if(power == 1)". Heisst also, die Funktion prüft, ob 4^1 gemeint ist ... wenn ja, gibt sie 4 zurück, sonst 4 * 4^(power-1).
Vom Code her wäre bereits das hier eine Steigerung der Effizienz:
ULONG GetPower(USHORT number, USHORT power)
{ ULONG result = number; while(--power) result *= number; return result; }
... das hat jetzt aber nichts mehr mit Rekursion zu tun.
- Als Antwort markiert Strean Sonntag, 4. November 2012 00:18
Alle Antworten
-
Hallo, ich kann zwar kaum C++ aber rein von der Funktionalotät rechnet dir GetPower die Potenz einer Zahl aus. Kurz gesagt, das was pow in C++ schneller hinbekommen würde. Es werden 2 Zahlen übergeben. In meinem Beispiel a (2) und b (3).
- b (3) ist nicht 1
- gebe a(2) *
GetPower(a (2), b (3) - 1) zurück
- b‘ (2) ist nicht 1
- gebe a(2) *
GetPower(a(2), b‘(2) – 1) zurück
- b‘‘ (1) ist 1
- gebe a zurück
- ergebnis = 2
- ergebnis = 4
- ergebnis = 8
Oder kurz: Man multipliziert a mit sich selbst und pro durchgang wird b um 1 erniedrigt bis b 0 ist.
Die von dir angesprochene, vorletzte Zeile gibt also nur das Ergebnis der 1 Grad kleineren Potenz mal die Basis zurück.
PS: pow geht garantiert schneller, als ein rekursiver Aufruf einer Funktion.
Koopakiller - http://koopakiller.ko.ohost.de/
- Als Antwort markiert Strean Sonntag, 4. November 2012 00:18
-
Das ist eine einfache Rekursion... das heisst, die Funktion ruft sich selber auf
Anmerkung am Rande: das kann sehr gefährlich sein, Stichwort "stack overflow" und ausserdem finde ich das sehr ineffizient, weil "calls" immer ineffizient sind... viel ineffizienter als "normale jumps".
Die Idee der Rekursion ist eigentlich selbsterklärend und im Grunde müsste man da auch ohne Erklärung drauf kommen können...
Trotzdem mal eine Ausführung:
Was du tun willst ist z.B. 4 hoch 8 ausrechnen (ich schreibe das 4^8). Wenn du das zerlegst ist das 4 * 4^7 ... und 4^7 wiederum ist 4 * 4^6 ... das geht dann weiter bis 4^1, was 4 ist... daher das "if(power == 1)". Heisst also, die Funktion prüft, ob 4^1 gemeint ist ... wenn ja, gibt sie 4 zurück, sonst 4 * 4^(power-1).
Vom Code her wäre bereits das hier eine Steigerung der Effizienz:
ULONG GetPower(USHORT number, USHORT power)
{ ULONG result = number; while(--power) result *= number; return result; }
... das hat jetzt aber nichts mehr mit Rekursion zu tun.
- Als Antwort markiert Strean Sonntag, 4. November 2012 00:18