rekursive funktion potenzieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
moh
User
Beiträge: 25
Registriert: Montag 15. April 2019, 21:53

Hallo zusammen,
ich habe diese funktion geschrieben aber die expotenz schreibweise wird nich akzaptiert innerhal der funktion.
weiß jemand, woran es liegt. und ob ander schreibweise gibt.


def exp(b**x):#b hoch x
if (x==1):
return exp(b)
elif(x%2==0):#potenz ist gerade
return exp(b**x/2)*(b**x/2)
else:
return exp(b**(x-1)*b)
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@moh: Andere Schreibweisen wofür? Was soll denn das in der Funktionssignatur bedeuten? Was soll die Funktion überhaupt machen?

Und was die Rekursion angeht: In jedem der Zweige steht ein rekursiver Aufruf – damit hört die Rekursion nie auf und Du bekommst nie tatsächlich ein Ergebnis. Also praktisch wird das schon aufhören – mit einer Ausnahme wenn das Rekursionslimit erreicht ist.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
moh
User
Beiträge: 25
Registriert: Montag 15. April 2019, 21:53

__blackjack__ hat geschrieben: Freitag 3. Mai 2019, 11:26 @moh: Andere Schreibweisen wofür? Was soll denn das in der Funktionssignatur bedeuten? Was soll die Funktion überhaupt machen?

Und was die Rekursion angeht: In jedem der Zweige steht ein rekursiver Aufruf – damit hört die Rekursion nie auf und Du bekommst nie tatsächlich ein Ergebnis. Also praktisch wird das schon aufhören – mit einer Ausnahme wenn das Rekursionslimit erreicht ist.
wenn ich schreibe: b**x als varible in der funktion ergibt mir einer fehler es wird nicht aktzaptiert
def exp(b**x):#SyntaxError: invalid syntax
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst schon wenigestens mal halb auf ein Grundlagentutorial schielen. Das ist eine Funktions DEFINTION. Darin kannst du nur Namen von Parametern angeben. Nicht beliebige Ausdruecke.
moh
User
Beiträge: 25
Registriert: Montag 15. April 2019, 21:53

__deets__ hat geschrieben: Freitag 3. Mai 2019, 11:54 Du musst schon wenigestens mal halb auf ein Grundlagentutorial schielen. Das ist eine Funktions DEFINTION. Darin kannst du nur Namen von Parametern angeben. Nicht beliebige Ausdruecke.
man definier einer funktion mit def und dann kommt die name der funktion und im klammern schreibt man doch einer variable(b hoch x)
kannst du mit tipps geben, wie kann ich das schreiebn?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, das ist NICHT so. Dort kommt NUR DER NAME HIN. Das was du mit dem Parameter machen willst kommt in den Block danach.

Es gibt tatsaechlich Faelle, in denen in Funktionssignaturen (also der Parameterliste) * und ** vorkommen, die sind aber hier irrelevant und fuer etwas komplett anderes gedacht.
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und man kann solche Ausdrücke für Defaultwerte verwenden, aber das ist auch etwas anderes, dann muss ein Name da stehen der diesen Wert bekommen soll.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
moh
User
Beiträge: 25
Registriert: Montag 15. April 2019, 21:53

Code: Alles auswählen

def exp(b,x):#b hoch x
    
   
    c=b**x
    
    
    if (x==1):
        return c
    
    elif(x/2==0):#potenz ist gerade 
        return (b**x/2)*(b**x/2)
    
    else:
        return (b**(x-1))*b
    
das was ich schreuíben will
Zuletzt geändert von moh am Freitag 3. Mai 2019, 12:42, insgesamt 1-mal geändert.
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Wenn du b**x durch eine Funktion berechnen lassen möchtest, dann sähe die so aus:

Code: Alles auswählen

def exp(b, x):
    return b**x

print(exp(3, 2))
>> 9
Die Frage ist nur, warum?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Du willst eine Funktion schreiben, die b ** x berechnet, also hast Du eine Funktion mit zwei Parametern exp(b, x). Innerhalb der Funktion darfst Du dann aber nicht ** verwenden, sondern statt dessen immer exp.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@ThomasL: ich denke mal, dass er das eigentlich selbst programmieren soll. Die Verwendung des **-Operators ist denke ich eigentlich nicht vorgesehen.
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

ah ok, jetzt verstehe ich worum es hier geht. :-)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`exp()` ist kein besonders guter Name, denn so eine Funktion gibt es bereits, und die berechnet die Potenz der mathematischen Konstante e (≈2.718281828459045) mit einem gegebenen Argument. Der übliche Name für die Potenzfunktion ist `pow()` und die gibt es auch unter dem Namen bereits in Python:

Code: Alles auswählen

In [6]: pow(3, 2)
Out[6]: 9
Eine selbst geschrieben Funktion könnte man dann vielleicht `power()` nennen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
moh
User
Beiträge: 25
Registriert: Montag 15. April 2019, 21:53

__blackjack__ hat geschrieben: Freitag 3. Mai 2019, 12:45 `exp()` ist kein besonders guter Name, denn so eine Funktion gibt es bereits, und die berechnet die Potenz der mathematischen Konstante e (≈2.718281828459045) mit einem gegebenen Argument. Der übliche Name für die Potenzfunktion ist `pow()` und die gibt es auch unter dem Namen bereits in Python:

Code: Alles auswählen

In [6]: pow(3, 2)
Out[6]: 9
Eine selbst geschrieben Funktion könnte man dann vielleicht `power()` nennen.
dachte, dass pow funktion nur in c . hätte ich mir doch viel arbeit speichern.
danke
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@moh: Wenn Du Dir Arbeit ersparen möchtest, dann verwende einfach den ``**``-Operator:

Code: Alles auswählen

In [7]: 3**2
Out[7]: 9
`pow()` würde ich nur verwenden wenn ich eine Funktion als Argument brauche, beispielsweise für `map()`, oder wenn man ganze Zahlen hat und das dritte Argument der Funktion benötigt, weil das effizienter ist als die Modulo-Operation nach dem normalen potenzieren anzuwenden. Und selbst wenn man sich die Funktion selbst implementieren würde, weil man die eingebaute `pow()`-Funktion und `operator.pow()` nicht kennen würde, dann würde man ja nicht irgendwelchen rekursiven Unsinn anfangen, sondern in der Funktion einfach den ``**``-Operator verwenden. So wie ThomasL das gezeigt hat.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten