我正在尝试解决《探索Python》书中的一个练习。但是,我想我不理解递归的概念。我写了一些递归函数。所以我知道一些方面。但是,我没有足够的经验。我已经停止学习编程大约一年了。
无论如何,让我给你一个完整的问题:
多边形可以由 (x, y) 对列表表示,其中每对
是一个元组:[ (x1, y1), (x2, y2), (x3, y3) , ... (xn, yn)]。写一个
计算多边形面积的递归函数。这可以是
通过“切断”三角形来完成,利用以下事实:
具有角 (x1, y1)、(x2, y2)、(x3, y3) 的三角形的面积为 (x1y1 +
x2y2 + x3y2 – y1x2 –y2x3 – y3x1) / 2。
尽管问题已经给出了公式,但我使用了另一个公式。因为,我对多边形的面积进行了一些研究。如果你看一下here公式不同。
一步步描述我的程序会更好,以便解释我想要什么。
好吧,由于递归,我必须声明全局作用域:
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()
EDIT One
阅读您的答案后,我明白了我的代码出了什么问题。所以我决定分享我的程序的最后一个版本以获得一些其他帮助。
同样,我必须声明全局变量。我如何从 senderle 应用( lop_triangle )函数
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()
请帮助我改进我的代码而不给出完整的解决方案。
EDIT Two
经过与senderle的讨论,我明白了问题出在哪里,并且senderle的解决方案比我的更好,所以我建议你应该使用它。
不管怎样,他帮助我使我的代码正确。我不得不再次更改我的公式。
area += x[i]*y[(i+1) % 3] - x[(i+1) % 3]*y[i]
他还补充说,对于较长的多边形,3 必须是 len(顶点)。
感谢大家抽出时间。