title: Using recursion in Python class methods
body: <p>NB Noob alert ...  !</p>
  
  <p>I am trying to use recursion in a Python class method, but with limited results.</p>
  
  <p>I'm trying to build a car class, with very basic attributes: id, position in a one lane road (represented by an integer), and velocity. One of the functions I have is used to return which car id is in front on this one -- i.e. if we have class:</p>
  
  <pre><code>class Car:
      def __init__(self, position, id, velocity):
          self.position = position
          self.id = id
          self.velocity = velocity
  </code></pre>
  
  <p>Now, I've come up with the following class method (additional details below the code):</p>
  
  <pre><code>def findSuccessorCar(self, cars):
  
      successorCar = ""
      smallestGapFound = 20000000 
  
      for car in cars:
          if car.id == self.id: continue
  
          currentGap = self.calculateGap(car)
  
          if (currentGap &gt; -1) and (currentGap &lt; smallestGapFound):
              smallestGapFound = currentGap
              successorCar = car
  
      if successorCar == "":
          return 1 # calling code checks for 1 as an error code
      else:        
          return successorCar
  </code></pre>
  
  <p>The plan is to create car objects, then store them in a list. Each time the findSuccessorMethod is called, this global list of cars is passed to it, e.g. </p>
  
  <pre><code>    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)
  </code></pre>
  
  <p>This works fine: the find successor car function will say that car c2 is in front of car c1 (position 7 ahead of position 4).</p>
  
  <p>However, I want car c1 to work out what car is in front of its immediate successor -- that is, which car is in front of the car in front, which in this case is car c3. My thinking was that if I did c1_succ.findSuccessorCars(cars) then this should work fine: doing type(c1_succ) shows it is an instance and hasattr shows that it has the anticipated object attributes. </p>
  
  <p>However, when I do try to execute c1_succ.findSuccessorCars(cars), an integer is returned. Hence, I am confused -- why doesn't this work? Why can you not recursively execute a class method in this fashion? Where does this integer come from?</p>
  
  <p>NB Gut feel says that this has something to do with the self declaration, and that I'll need to modify my code so that as well as a global list of cars, there'll need to be a global list of their current positions, or another class method, e.g. 
  findSuccessorsSuccessor (yes, fully aware of crummy naming!). However, I am interested to understand why this recursive approach does not work. </p>
  
  <p>UPDATE</p>
  
  <p>Here is the requested code for calculating a gap between 2 cars -- I appreciate it is very basic, so not too much laughter at the back please.</p>
  
  <pre><code>    def calculateGap(self, car):
          ''' Calculate the gap between two cars
          '''
          thisCar = self
          otherCar = car
  
          gap = otherCar.position_x - thisCar.position_x 
  
          return gap
  </code></pre>