Potenz berechnen mit einer schleife ohne pow

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Potenz berechnen mit einer schleife ohne pow

    Hallo ich lerne gerade Swift3 allerdings komme ich nun an meine grenzen, da ich nicht weiss wo oder wie ich den code
    ansetzen soll.

    ich soll eine Potenz in einer eigenen Funktion erstellen und diese dann durch eine Schleife errechnen ohne pow.
    normale schleifen die von 1 - 10 hoch zählen ist kein Thema. - aber damit rechnen hab ich noch keine Idee für die Umsetzung
    folgenden Code habe ich bereits für einen rechner.

    hoffe ihr könnt mir einen Denk Anstoss geben.
    Vielen Dank im voraus

    Quellcode

    1. print ("Bitte geben sie ihre Rechenart an:\n")
    2. print ("1 --> ^\n")
    3. let rechnen = Int(readLine()!)!
    4. switch rechnen {
    5. case 1: //Potenzieren
    6. func pont (basis : Int, hoch : Int) -> Int {
    7. let ergebnis = basis ? hoch // ? wie soll ich es angehen
    8. return ergebnis
    9. }
    10. print ("Bitte geben Sie die erste Zahl ein:")
    11. let eingabe1 = Int(readLine()!)!
    12. print ("Bitte geben Sie die zweite Zahl ein:")
    13. let eingabe2 = Int(readLine()!)!
    14. print("Ergebins \(eingabe1 ? eingabe2 )")
    15. default:
    16. print("Error")
    17. }
    Alles anzeigen
  • gritsch schrieb:

    muss es eine schleife sein?

    dafür verwendet man doch am einfachsten rekusion:

    Quellcode

    1. int powerN(int base, int n)
    2. {
    3. if (n < 0)
    4. {
    5. // WTF?
    6. return -1;
    7. }
    8. if (n == 0)
    9. {
    10. return 1;
    11. }
    12. return base * powerN(base, n - 1);
    13. }
    Alles anzeigen
    Es kann sein, dass ich einfach nur zu blöd bin und das gerade falsch sehe. Aber der Code funktioniert doch nicht, wenn du z.B 3^(-2) hast oder sehe ich das einfach nur falsch?
  • AppleDeveloper schrieb:

    gritsch schrieb:

    muss es eine schleife sein?

    dafür verwendet man doch am einfachsten rekusion:

    Quellcode

    1. int powerN(int base, int n)
    2. {
    3. if (n < 0)
    4. {
    5. // WTF?
    6. return -1;
    7. }
    8. if (n == 0)
    9. {
    10. return 1;
    11. }
    12. return base * powerN(base, n - 1);
    13. }
    Alles anzeigen
    Es kann sein, dass ich einfach nur zu blöd bin und das gerade falsch sehe. Aber der Code funktioniert doch nicht, wenn du z.B 3^(-2) hast oder sehe ich das einfach nur falsch?
    deswegen hab ich auch WTF d ahingeschrieben. Wenn das im gültigen wertebereich liegt dann muss ers eben implementieren. return 1 / ... ist ja nicht so schwer. Wenn er fließkomma-unterstützung braucht kann ers auch abändern. das sollte ja nur ein beispiel für eine rekursive lösung sein.
  • Bow schrieb:

    ich soll
    Das klingt für mich sehr nach Haus- oder Kursaufgabe. Deshalb poste ich auch keinen 'Lösungscode'.

    Unter der Annahme, daß es dabei nur um positive Ganzzahlen gehen soll, ist eine Implementierung äußerst banal. In einer while-Schleife wird ein Zähler abhängig vom Exponenten gezählt und entsprechend oft ein Rückgabewert mit der Basis multipliziert.

    Bow schrieb:

    ja es muss eine schleife sein, so die Aufgabenstellung.
    Viel interessanter (nicht unbedingt immer besser) in Swift ist es allerdings durch funktionale Programmierung, sich gerade das Ausformulieren solcher Schleifenprozesse ersparen zu können.

    Beispiel dazu für diesen Anwendungsfall:

    Quellcode

    1. func pot(base: Int, exp: Int) -> Int {
    2. return (1..<exp).reduce(base){ r, _ in r * base }
    3. }
    4. let x = pot(base: 2, exp: 3) // 8

    Der andere Punkt, der in Swift eher interessant und eine Herausforderung ist, ist es, bedingt durch das Typsystem, so etwas generisch für alle in Frage kommenden Typen zu formulieren.

    Hier z.B. durch Protokollabhängigkeit:

    Quellcode

    1. func pot<T: SignedInteger>(base: T, exp: T) -> T where T.Stride: SignedInteger {
    2. return (1..<exp).reduce(base){ r, _ in r * base }
    3. }
    4. let x = pot(base: 2, exp: 3) // 8

    Anm.: where T.Stride: SignedInteger ist hier nötig, damit aus 1..<exp eine durchzählbare CountableRange, statt einer bloßen Range wird.

    Last but not least könnte man auch in einer Protokollerweiterung einen eigenen Rechenoperator definieren.
    Beispiel:

    Quellcode

    1. infix operator ^^
    2. extension SignedInteger where Stride: SignedInteger {
    3. static func ^^(base: Self, exp: Self) -> Self {
    4. return (1..<exp).reduce(base){ r, _ in r * base }
    5. }
    6. }
    7. let x = 2^^3 // 8
    Anm.: ^^ weil ^ schon als logisches XOR verwendet wird.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?