NB Noob-Alarm ... !
Ich versuche, die Rekursion in einer Python-Klassen-Methode zu verwenden, aber mit begrenzten Ergebnissen.
Ich versuche, eine Auto-Klasse zu bauen, mit sehr grundlegenden Attribute: id, Position in einer einspurigen Straße (dargestellt durch eine ganze Zahl), und Geschwindigkeit. Eine der Funktionen, die ich habe, wird verwendet, um zurückzugeben, welches Auto id ist vor auf dieser - d.h., wenn wir Klasse haben:
class Car:
def __init__(self, position, id, velocity):
self.position = position
self.id = id
self.velocity = velocity
Nun habe ich mir die folgende Klassenmethode ausgedacht (weitere Details unterhalb des Codes):
def findSuccessorCar(self, cars):
successorCar = ""
smallestGapFound = 20000000
for car in cars:
if car.id == self.id: continue
currentGap = self.calculateGap(car)
if (currentGap > -1) and (currentGap < smallestGapFound):
smallestGapFound = currentGap
successorCar = car
if successorCar == "":
return 1 # calling code checks for 1 as an error code
else:
return successorCar
Der Plan ist, Auto-Objekte zu erstellen und sie dann in einer Liste zu speichern. Jedes Mal, wenn die findSuccessorMethode aufgerufen wird, wird diese globale Liste von Autos an sie übergeben, z.B.
c1 = testCar.Car(4, 5, 1) # position, pos_y, Vel, ID
c2 = testCar.Car(7, 9, 2)
c3 = testCar.Car(9, 1, 2)
cars = [c1, c2, c3]
c1_succ = c1.findSuccessorCar(cars)
Das funktioniert gut: Die Funktion find successor car sagt, dass der Wagen c2 vor dem Wagen c1 steht (Position 7 vor Position 4).
Ich möchte jedoch, dass Auto c1 herausfindet, welches Auto vor seinem unmittelbaren Nachfolger steht - das heißt, welches Auto vor dem Auto davor steht, das in diesem Fall Auto c3 ist. Mein Gedanke war, dass, wenn ich c1_succ.findSuccessorCars(cars) dann sollte dies gut funktionieren: tun type(c1_succ) zeigt es ist eine Instanz und hasattr zeigt, dass es die erwarteten Objektattribute hat.
Wenn ich jedoch versuche, c1_succ.findSuccessorCars(cars) auszuführen, wird eine Ganzzahl zurückgegeben. Daher bin ich verwirrt - warum funktioniert das nicht? Warum kann man eine Klassenmethode nicht auf diese Weise rekursiv ausführen? Woher kommt diese ganze Zahl?
NB Das Bauchgefühl sagt, dass dies etwas mit der Selbstdeklaration zu tun hat, und dass ich meinen Code so ändern muss, dass es neben einer globalen Liste der Autos auch eine globale Liste ihrer aktuellen Positionen geben muss, oder eine andere Klassenmethode, z. B. findSuccessorsSuccessor (ja, ich bin mir der miserablen Namensgebung voll bewusst!) Ich bin jedoch daran interessiert zu verstehen, warum dieser rekursive Ansatz nicht funktioniert.
UPDATE
Hier ist der angeforderte Code für die Berechnung eines Abstands zwischen 2 Autos - ich weiß, dass es sehr einfach ist, also bitte nicht zu viel Gelächter auf der Rückseite.
def calculateGap(self, car):
''' Calculate the gap between two cars
'''
thisCar = self
otherCar = car
gap = otherCar.position_x - thisCar.position_x
return gap