Seite 1 von 1

rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 11:17
von moh
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)

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 11:26
von __blackjack__
@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.

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 11:36
von moh
__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

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 11:54
von __deets__
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.

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 12:00
von moh
__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?

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 12:02
von __deets__
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.

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 12:18
von __blackjack__
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.

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 12:31
von moh

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

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 12:34
von ThomasL
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?

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 12:36
von Sirius3
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.

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 12:37
von __deets__
@ThomasL: ich denke mal, dass er das eigentlich selbst programmieren soll. Die Verwendung des **-Operators ist denke ich eigentlich nicht vorgesehen.

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 12:40
von ThomasL
ah ok, jetzt verstehe ich worum es hier geht. :-)

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 12:45
von __blackjack__
`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.

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 12:54
von moh
__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

Re: rekursive funktion potenzieren

Verfasst: Freitag 3. Mai 2019, 13:17
von __blackjack__
@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.