以杨辉三角形的三种实现体会python的编程特性

Posted kevins-yuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以杨辉三角形的三种实现体会python的编程特性相关的知识,希望对你有一定的参考价值。

杨辉三角形因为其形式简单,又有一定的使用价值,因此是入门编程题中被用的最多的,也是很好的语言实例标的。
下面就杨辉三角形使用python的三种解法,来看看看python的编程特性。
 
第一种:传统编程思路
这种思路的特点是中规中矩,符合一般人的思考思路,特别适合初学编程的人员阅读。但缺点是传统命令式编程使得代码显得比较繁琐。这个解法显然也没怎么用python的语言特征,换成其他语言几乎可以逐行照搬。代码如下:
 
 1 # 传统的杨辉三角形实现
 2 def pascal(row):
 3     result_list = [0] * (row * 2 + 1)
 4 
 5     for row_loc in range(row):
 6         base_loc = row - row_loc - 1
 7         if row_loc == 0:
 8             result_list[base_loc] = 1
 9         else:
10             result_list[base_loc] = result_list[base_loc + 1]
11             for line_loc in range(row_loc):
12                 now_loc = base_loc + (line_loc + 1) * 2
13                 result_list[now_loc] = result_list[now_loc - 1] + result_list[now_loc + 1]
14                 result_list[now_loc - 1] = 0
15 
16         print str(result_list) 17             .replace("]", ",").replace(" 0,", "  ").replace(",", "").replace("[0", "  ").replace("[", " ")
18 
19 pascal(15)
第二种:基于python的列表迭代的思路
这个实现利用python的列表处理特性来实现,代码比传统思路要简洁很多,也还算好懂。缺点是仍然不够简洁。代码如下(来自于毛豆子,原文链接:http://www.cnblogs.com/maodouzi/archive/2011/07/12/2104153.html):
 
 1 # 利用python列表迭代的实现
 2 def printLine(lineList,row):
 3     lineList = [str(tmpNum) for tmpNum in lineList]
 4     print("%s%s" % (" " * (row - len(lineList)), " ".join(lineList)))
 5 
 6 def pascal(row):
 7     for i in range(row):
 8         if i < 2:
 9             yhList = [1] * (i + 1)
10         else:
11             yhList[1:-1] = [(tmpNum + yhList[j])  for j, tmpNum in enumerate(yhList[1:])]
12         printLine(yhList,row)
13 
14 pascal(10)

 

第三种:函数式编程思路
这个实现大量利用了python这种现代语言的特征,函数式编程+map-reduce的实现方案使得代码极为简练。另外row函数完全无依赖地得到任意一行的数据行,这也很好地体现了函数式编程无依赖的特性。不过对于不熟悉这套解法的人员来说,显然代码的可读性不太好,看起来比较费劲。但随着大家都开始熟悉这种编程范式,其可读性问题应该可以得到缓解。另外一个缺点是由于过分追求函数式编程,使得为了居中的长度计算就使得每行的计算都附带了一次最后一行的计算,同时每行不能利用上一次的计算结果,因此计算复杂度显然提升了很多,这不能不说是函数式编程的一个问题。代码如下(来自于expl0rer,原链接为:http://www.oschina.net/code/snippet_103482_17210 ):
 
1 # 基于函数式编程思路的实现
2 def row(x):
3     return ‘ ‘.join(map(str, reduce(lambda x, y: map(  sum, zip([0] + x, x + [0])  ), range(x), [1] )))
4 
5 def pascal(x):
6     return ‘
‘.join(row(i).center(len(row(x - 1))) for i in range(x))
7 
8 print pascal(10)

以上是关于以杨辉三角形的三种实现体会python的编程特性的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯国赛真题07python杨辉三角形 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析

Python案例:打印杨辉三角形

python杨辉三角形原理

杨辉三角形函数 JavaScript Generator 实现

C语言编程输出杨辉三角形(要求输出10行)?

用java编写金字塔型的杨辉三角形程序