杨辉三角形因为其形式简单,又有一定的使用价值,因此是入门编程题中被用的最多的,也是很好的语言实例标的。
下面就杨辉三角形使用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 ‘\n‘.join(row(i).center(len(row(x - 1))) for i in range(x)) 7 8 print pascal(10)
原文地址:https://www.cnblogs.com/kevins-yuan/p/9990449.html