Newcomer hat geschrieben:Ich hab hier n Code der nicht so funktionieren soll, wie er soll (-:
Code: Alles auswählen
def verdoppeln(int,bis):
for i in range(1,bis):
return verdoppeln(int*2,bis-1)
Wenn du es rekursiv machen willst, brauchst du keine for-Schleife. Statt dessen brauchst du einen sog. base case, AKA Abbruchbedingung:
Code: Alles auswählen
def verdoppeln(i, n):
if n == 0:
return i
elif n > 0:
return verdoppeln(i * 2, n - 1)
else:
raise ValueError('Zahl kaputt!! n muss größer als Null sein')
Der base case hier ist n == 0. n ist dabei eine Steuer-Variable, die solange modifiziert wird, bis der base case erreicht wird. i ist ein sog. Accumulator, dh. eine Datenstruktur, die die Ergebnisse jeder Rekursions-Stufe aufnimmt und die in die Rekursion weitergereicht wird. In deinem Beispiel ist es einfach ein int dessen Wert jedesmal verdoppelt wird. Hier ein anderes Beispiel:
Code: Alles auswählen
def umkehren(alist, acc):
if alist == []: # base case
return acc
else: # rekursion
return umkehren(alist[:-1], acc + alist[-1:])
print umkehren([1, 2, 3, 4], []) # --> [4, 3, 2, 1]
Rekursion braucht immer wenigstens einen base case und einen rekursiven Aufruf. Einen Accumulator braucht man nicht immer:
Code: Alles auswählen
def umkehren1(alist):
if alist == []: # base case
return []
else: # rekursion
return alist[-1:] + umkehren1(alist[:-1])
print umkehren1([1, 2, 3, 4]) # --> [4, 3, 2, 1]
Auch dein Beispiel braucht keinen Accumulator:
Code: Alles auswählen
def verdoppeln1(i, n):
if n == 0: # base case
return i
elif n > 0: # rekursion
return 2 * verdoppeln1(i, n - 1)
else:
raise ValueError('Zahl kaputt!! n muss größer als Null sein')
Als Übungs-Aufgaben für Rekursion werden gerne das Umkehren von Listen verwendet, wie oben, oder das Erzeugen der Fibonacci-Folge oder die
Türme von Hanoi. Die hab ich in QBASIC geschrieben als ich Rekursion gelernt habe, mitsamt grafischer Ausgabe.
Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.