Área de un polígono (Recursivamente usando Python)

Estoy intentando resolver un ejercicio del libro Explorando Python. Pero, supongo que no entiendo el concepto de la recursión. He escrito alguna función recursiva. Por eso conozco algunos de los aspectos. Pero no tengo suficiente experiencia. Y me detuve para estudiar programación alrededor de un año.

e todos modos, déjame darte la pregunta completa:

Un polígono se puede representar mediante una lista de pares (x, y) donde cada par es una tupla: [(x1, y1), (x2, y2), (x3, y3), ... (xn, yn) ] Escribe una función recursiva para calcular el área de un polígono. Esto se puede lograr "cortando" un triángulo, usando el hecho de que un triángulo con esquinas (x1, y1), (x2, y2), (x3, y3) tiene área (x1y1 + x2y2 + x3y2 - y1x2 –y2x3 - y3x1) / 2.

A pesar del hecho de que, la pregunta ya dio la fórmula, usé otra fórmula. Porque hice una investigación sobre el área de un polígono. Y si miras aaqu la fórmula es diferente.

Y describir mi programa paso a paso sería mejor para explicar lo que quiero. OK, tuve que declarar alcances globales, debido a la recursividad:

area = 0
x = [0] * 3
y = [0] * 3 

Y luego, creé una función recursiva. Como resultado, esta función siempre devuelve cero. Entonces mi verdadero problema es este:

def areaofpolygon(polygon, i):
    global area, x, y # My variables 
    try: # I prefered using try statement from using if-else statements. So it is the easier I guess.
        x[i], y[i] = polygon[i] # X and Y coordinates from tuple
        area += (x[i]*y[i+1] - x[i+1]*y[i]) #My formula
    except IndexError:
        return area/2

    areaofpolygon(polygon, i+1)   # Here, this is my weird recursion

Y mi función principal:

  def main():
      mypolygon = [(1,2), (2,5), (1,4)] # I declared polygon as tuples
      # I called my function and started to count from zero, and the result will be prompted.
      print(areaofpolygon(mypolygon,0))

      return 0
  if __name__ == '__main__':
      main()

Y aquí está mi código completo sin comentarios:

'''
Created on Feb 24, 2012

@author: msarialp
'''
area = 0
x = [0] * 3
y = [0] * 3
def areaofpolygon(polygon, i):
    global area, x, y
    try:
        x[i], y[i] = polygon[i]
        area += (x[i]*y[i+1] - x[i+1]*y[i])
    except IndexError:
        return area/2

    areaofpolygon(polygon, i+1)   
def main():
    mypolygon = [(1,2), (2,5), (1,4)]
    print(areaofpolygon(mypolygon,0))

    return 0
if __name__ == '__main__':
    main()

EDIT One

Después de leer sus respuestas, entendí lo que estaba mal con mi código. Así que decidí compartir la última versión de mi programa para obtener otras ayudas. Nuevamente, tuve que declarar variables globales. ¿Cómo puedo aplicar la función (lop_triangle) desde senderle

area = 0
x = [0] * 3
y = [0] * 3

Mi función que divide la tupla y para obtener las coordenadas x e y.

def sides_of_polygon(polygon, i):
    global x, y
    try:
        x[i], y[i] = polygon[i]
        return sides_of_polygon(polygon, i+1)
    except IndexError:
        return x, y

Mi función calcula el área del polígono (igual que antes)

def area_of_polygon(x, y, i):
    global area
    try:
        area += x[i]*y[i+1] - x[i+1]*y[i]
        return area_of_polygon(x, y, i+1)
    except IndexError:
        return area/2.0

Mi función principal ...

def main():
    mypolygon = [(1,2), (2,5), (1,4)]
    dx, dy = sides_of_polygon(mypolygon, 0)
    print(area_of_polygon(dx,dy,0))

    return 0
if __name__ == '__main__':
    main()

Por favor, ayúdame a mejorar mi código sin dar una solución completa.

EDIT Two

Después de debatir con senderle, entendí dónde está el problema y la solución de senderle es mejor que la mía, así que sugiero que la use. De todos modos, Él me ayudó a corregir mi código y tuve que cambiar mi fórmula nuevamente.

area += x[i]*y[(i+1) % 3] - x[(i+1) % 3]*y[i]

También agregó para polígonos más largos 3 deben ser len (vértices). Gracias a todos por su tiempo.

Respuestas a la pregunta(6)

Su respuesta a la pregunta