python 三角形编程里三角形如何把边化成角

Python 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。
本文是一个Python和erlang实现的输出一个杨辉三角的例子,同时还提供了一个erlang版杨辉三角,需要的朋友可以参考下
:杨辉三角,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列。
稍微看一下直观一点的图:
        1
       1 1
      1 2 1
     1 3 3 1
    1 4 6 4 1
   1 5 10 10 5 1
  1 6 15 20 15 6 1
 1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
杨辉三角有以下几个特点:
每一项的值等于他左上角的数和右上角的数的和,如果左上角或者右上角没有数字,就按0计算。
第N层项数总比N-1层多1个
计算第N层的杨辉三角,必须知道N-1层的数字,然后将相邻2项的数字相加,就能得到下一层除了最边上2个1的所有数字。 听起来有点像递归的思想,我们不妨假设我们已经知道N-1层的数字,来计算一下N层的数字吧。
def _yanghui_trangle(n, result):
&&& if n == 1:
&&&&&&& return [1]
&&&&&&& return [sum(i) for i in zip([0] + result, result + [0])]
上面代码中,result表示N-1层杨辉三角的数字。实习上,我们在列表2端各补了一个0,然后计算相邻项的和,就可以直接得到结果。
稍微完善一下代码:
def yanghui_trangle(n):
&&& def _yanghui_trangle(n, result):
&&&&&&& if n == 1:
&&&&&&&&&&& return [1]
&&&&&&& else:
&&&&&&&&&&& return [sum(i) for i in zip([0] + result, result + [0])]
&&& pre_result = []
&&& for i in xrange(n):
&&&&&&& pre_result = _yanghui_trangle(i + 1, pre_result)
&&&&&&& yield pre_result
if __name__ == &__main__&:
&&& for line in yanghui_trangle1(5):
&&&&&&& print line
_yanghui_trangle可以用lambda的方式简写,但是可读性感觉会变差,所以还是保持现状好了。
tips: 上面的程序并没有考虑数据格式化的问题,也就是说输出不是完美的三角形。
鉴于最近在学习erlang,补上一个erlang版本的,性能上没有测试过,不过还是要惊叹于函数式语言的表达能力:
-module(yanghui).
-author(lfyzjck).
-export([triangle/1]).
triangle_next(P) -&
&&& lists:zipwith(fun(X, Y) -& X+Y end, [0|P], P ++ [0]).
triangle(1) -&
&&& [[1]];
triangle(N) -&
&&& L = triangle(N - 1),
&&& [H|_] = L,
&&& [triangle_next(H)|L].
Copyright &
All Rights Reserved &&&&&&以杨辉三角形的三种实现体会python的编程特性 - 阿达哥 - 博客园
杨辉三角形因为其形式简单,又有一定的使用价值,因此是入门编程题中被用的最多的,也是很好的语言实例标的。
下面就杨辉三角形使用python的三种解法,来看看看python的编程特性。
第一种:传统编程思路
这种思路的特点是中规中矩,符合一般人的思考思路,特别适合初学编程的人员阅读。但缺点是传统命令式编程使得代码显得比较繁琐。这个解法显然也没怎么用python的语言特征,换成其他语言几乎可以逐行照搬。代码如下:
1 # 传统的杨辉三角形实现
2 def pascal(row):
result_list = [0] * (row * 2 + 1)
for row_loc in range(row):
base_loc = row - row_loc - 1
if row_loc == 0:
result_list[base_loc] = 1
result_list[base_loc] = result_list[base_loc + 1]
for line_loc in range(row_loc):
now_loc = base_loc + (line_loc + 1) * 2
result_list[now_loc] = result_list[now_loc - 1] + result_list[now_loc + 1]
result_list[now_loc - 1] = 0
print str(result_list) \
.replace("]", ",").replace(" 0,", "
").replace(",", "").replace("[0", "
").replace("[", " ")
19 pascal(15)
第二种:基于python的列表迭代的思路
这个实现利用python的列表处理特性来实现,代码比传统思路要简洁很多,也还算好懂。缺点是仍然不够简洁。代码如下(来自于毛豆子,原文链接:/maodouzi/archive//2104153.html):
1 # 利用python列表迭代的实现
2 def printLine(lineList,row):
lineList = [str(tmpNum) for tmpNum in lineList]
print("%s%s" % (" " * (row - len(lineList)), " ".join(lineList)))
6 def pascal(row):
for i in range(row):
yhList = [1] * (i + 1)
yhList[1:-1] = [(tmpNum + yhList[j])
for j, tmpNum in enumerate(yhList[1:])]
printLine(yhList,row)
14 pascal(10)
第三种:函数式编程思路
这个实现大量利用了python这种现代语言的特征,函数式编程+map-reduce的实现方案使得代码极为简练。另外row函数完全无依赖地得到任意一行的数据行,这也很好地体现了函数式编程无依赖的特性。不过对于不熟悉这套解法的人员来说,显然代码的可读性不太好,看起来比较费劲。但随着大家都开始熟悉这种编程范式,其可读性问题应该可以得到缓解。另外一个缺点是由于过分追求函数式编程,使得为了居中的长度计算就使得每行的计算都附带了一次最后一行的计算,同时每行不能利用上一次的计算结果,因此计算复杂度显然提升了很多,这不能不说是函数式编程的一个问题。代码如下(来自于expl0rer,原链接为:http://www.oschina.net/code/snippet_10 ):
1 # 基于函数式编程思路的实现
2 def row(x):
return ' '.join(map(str, reduce(lambda x, y: map(
sum, zip([0] + x, x + [0])
), range(x), [1] )))
5 def pascal(x):
return '\n'.join(row(i).center(len(row(x - 1))) for i in range(x))
8 print pascal(10)
阅读(...) 评论()使用Python计算一个图形中的三角形数目
在微信的朋友圈中看到了一个游戏,数一下图形中到底有多少个三角形。图形很简单,为了方便解决问题我给每个点标了字母后大致如下:
答案五花八门,有的人说18,有的人说27,30。甚至有人说50。
其实,我觉得这个问题应该很简单,以一个程序员的思维我的解决方案如下:
1,自动生成任意三个点的所有组合;
2,看看任意两个点是不是在图中同一条线上,如果在进入第3步,不在的话说明这个组合不构不成三角形;
3,如果三个点全都在同一条直线上,构不成三角形,否则能够构成三角形。
OK,算法搞定,所有的工作这样就分成了两类:第一,找出所有最长边的点组合;第二,排列组合并判断。第一个是个体力活,稍微简单。第二个其实也简单,也就是一个迭代器的使用。
编写Python代码如下:
&1 #!/usr/bin/python
---------------------------------------------------------------------------------------------------
***************************************************************************************************
& 7 Counter all the triangles in a
---------------------------------------------------------------------------------------------------
&11 import itertools,string
&13 def CounterTriangle():
& & print "All the triangles we
can find in the picture are as follows:"
& & triangle_number
& & sides_match_list
['abh','acgi','adfj','aek','bcde','efgh','hijk']
& & dot_list &
& & while i & 26:
dot_list.append(string.lowercase[i])
string.lowercase[i] == 'k':
& & for each_combination binations(dot_list,3):
triangle_flag = True
each_dot_combination binations(each_combination,2):
& for each_side in sides_match_list:
& & if each_dot_combination[0] in
each_side and each_dot_combination[1] in each_side:
triangle_flag = True
triangle_flag = False
& & triangle_flag = False
& & & line_flag
each_side in sides_match_list:
& if each_combination[0] in each_side and
each_combination[1] in each_side and each_combination[2] in
each_side:
& & line_flag = True
triangle_flag == True and line_flag == False:
& triangle_number += 1
& print "%d : %s" %
(triangle_number,each_combination)
& & print "The number of
triangles in the picture is : %d" % triangle_number
&46 CounterTriangle()
---------------------------------------------------------------------------------------------------------
程序执行如下:
没有仔细验证我的程序对不对,但是我觉得应该是24吧!
如果图形变了,其实只需要改变一下长边点集sides_match_list 的信息即可。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Python能不能方便的画三角形?
[问题点数:80分,结帖人b381463]
Python能不能方便的画三角形?
[问题点数:80分,结帖人b381463]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2014年8月 其他开发语言大版内专家分月排行榜第二2014年7月 其他开发语言大版内专家分月排行榜第二2014年5月 其他开发语言大版内专家分月排行榜第二2014年4月 其他开发语言大版内专家分月排行榜第二2014年3月 其他开发语言大版内专家分月排行榜第二2014年1月 其他开发语言大版内专家分月排行榜第二2013年12月 其他开发语言大版内专家分月排行榜第二2013年11月 其他开发语言大版内专家分月排行榜第二2013年3月 其他开发语言大版内专家分月排行榜第二2012年5月 其他开发语言大版内专家分月排行榜第二2012年4月 其他开发语言大版内专家分月排行榜第二2010年10月 其他开发语言大版内专家分月排行榜第二2010年9月 其他开发语言大版内专家分月排行榜第二
2013年9月 其他开发语言大版内专家分月排行榜第三2012年6月 其他开发语言大版内专家分月排行榜第三
2012年1月 其他开发语言大版内专家分月排行榜第二2011年5月 其他开发语言大版内专家分月排行榜第二2010年12月 其他开发语言大版内专家分月排行榜第二2009年2月 其他开发语言大版内专家分月排行榜第二2008年9月 其他开发语言大版内专家分月排行榜第二2008年8月 其他开发语言大版内专家分月排行榜第二2008年5月 其他开发语言大版内专家分月排行榜第二2007年11月 其他开发语言大版内专家分月排行榜第二
2011年4月 其他开发语言大版内专家分月排行榜第三2011年1月 其他开发语言大版内专家分月排行榜第三2009年6月 其他开发语言大版内专家分月排行榜第三2009年4月 其他开发语言大版内专家分月排行榜第三2009年1月 其他开发语言大版内专家分月排行榜第三2008年11月 其他开发语言大版内专家分月排行榜第三2008年7月 其他开发语言大版内专家分月排行榜第三2008年6月 其他开发语言大版内专家分月排行榜第三2006年9月 其他开发语言大版内专家分月排行榜第三
2014年8月 其他开发语言大版内专家分月排行榜第二2014年7月 其他开发语言大版内专家分月排行榜第二2014年5月 其他开发语言大版内专家分月排行榜第二2014年4月 其他开发语言大版内专家分月排行榜第二2014年3月 其他开发语言大版内专家分月排行榜第二2014年1月 其他开发语言大版内专家分月排行榜第二2013年12月 其他开发语言大版内专家分月排行榜第二2013年11月 其他开发语言大版内专家分月排行榜第二2013年3月 其他开发语言大版内专家分月排行榜第二2012年5月 其他开发语言大版内专家分月排行榜第二2012年4月 其他开发语言大版内专家分月排行榜第二2010年10月 其他开发语言大版内专家分月排行榜第二2010年9月 其他开发语言大版内专家分月排行榜第二
2013年9月 其他开发语言大版内专家分月排行榜第三2012年6月 其他开发语言大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 java编程三角形 的文章

 

随机推荐