Я пытаюсь выполнить упражнение из книги «Изучение Python». Но, думаю, я не понимаю концепцию рекурсии. Я написал некоторую рекурсивную функцию. Поэтому я знаю некоторые аспекты. Но мне не хватает опыта. И я перестал изучать программирование около года.
В любом случае, позвольте мне задать вам полный вопрос:
Многоугольник может быть представлен списком (x, y) пар, где каждая пара
является кортежем: [(x1, y1), (x2, y2), (x3, y3), ... (xn, yn)]. Напиши
рекурсивная функция для вычисления площади многоугольника. Это может быть
достигается путем «отрезания» треугольника, используя тот факт, что
треугольник с углами (x1, y1), (x2, y2), (x3, y3) имеет площадь (x1y1 +
x2y2 + x3y2 - y1x2 –y2x3 - y3x1) / 2.
Несмотря на то, что вопрос уже дал формулу, я использовал другую формулу. Потому что, я провел некоторое исследование об области многоугольника. И если вы посмотрите на здесь , формула будет другой.
И пошаговое описание моей программы было бы лучше, чтобы объяснить, чего я хочу.
ОК, мне пришлось объявить глобальные области действия из-за рекурсии:
area = 0
x = [0] * 3
y = [0] * 3
А потом я создал рекурсивную функцию. В результате эта функция всегда возвращает ноль. Поэтому моя настоящая проблема заключается в следующем:
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
И моя основная функция:
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()
А вот мой полный код без комментариев:
'''
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()
РЕДАКТИРОВАТЬ Один
Прочитав ваши ответы, я понял, что случилось с моим кодом. Поэтому я решил поделиться последней версией моей программы, чтобы получить другие подсказки.
Опять же, мне пришлось объявить глобальные переменные. Как я могу применить (lop_triangle) функцию из senderle
area = 0
x = [0] * 3
y = [0] * 3
Моя функция, которая делит кортеж и получает координаты x и 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
Моя функция вычисления площади многоугольника (такая же, как и раньше)
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
Моя основная функция ...
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()
Пожалуйста, помогите мне улучшить мой код без полного решения.
РЕДАКТИРОВАТЬ Два
После обсуждения с senderle я понял, в чем проблема, и решение senderle лучше моего, поэтому я предлагаю вам воспользоваться им.
В любом случае, он помог мне исправить мой код. И мне пришлось снова изменить формулу.
area += x[i]*y[(i+1) % 3] - x[(i+1) % 3]*y[i]
Он также добавлен для более длинных полигонов 3 должен быть len (вершины).
Спасибо всем за уделенное время.