1. 程式人生 > >以楊輝三角形的三種實現體會python的編程特性

以楊輝三角形的三種實現體會python的編程特性

楊輝三角 數據 楊輝三角形 簡練 初學 line blog 代碼 com

楊輝三角形因為其形式簡單,又有一定的使用價值,因此是入門編程題中被用的最多的,也是很好的語言實例標的。 下面就楊輝三角形使用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)

以楊輝三角形的三種實現體會python的編程特性