此处转载别人的内容加上一些自己的思考,转载网址: https://blog.csdn.net/Watson_Ashin/article/details/81272803
杨辉三角简介
杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合 ----来自百度百科。
总之,杨辉三角特点:它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和。
下面是一个直观图:
代码
def count_yanghui():
"""计算每一行杨辉三角数"""
a=[1]
while True:
yield a
a=[sum(i) for i in zip([0]+a,a+[0])]#杨辉三角算法
def control_circulation(max_num):
"""由用户决定打印几行杨辉三角"""
n=0
for x in count_yanghui():
print(x)#以列表形式输出每一行杨辉三角数,即print(a)
n+=1
if n==int(max_num):
break
if __name__=="__main__":
n=input("请输入需要打印的杨辉三角行数:")
control_circulation(n)
输出:
请输入需要打印的杨辉三角数:6
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
代码释疑:
- count_yanghui()函数中,以列表形式初始化了第一行杨辉三角数,该函数包含关键字yield,表示是一个生成器函数,记录着函数上下文变量的状态。每次执行到yield返回a列表
- count_yanghui()函数中,讲a=[sum(i) for i in zip([0]+a,a+[0])]之前,先解释zip(),第一次循环返回初始化a列表,第二次循环zip([0]+a,a+[0])相当zip([0,1],[1,0]),zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。其返回[(0,1),(1,0)],其实就是讲第一行杨辉三角数1扩展为0,1,0,接着将列表中的每一个元组(0,1),(1,0)做一个sum()运算保存在列表中此时a=[1,1]。规律就是这样,后面照猫画虎。
优化上文代码
由于打印的杨辉三角数是左对齐,此时想把杨辉三角输出结果居中显示(呈金字塔显示)怎么办?
被转载博主的想法是不以列表的形式输出打印杨辉三角数,而是以字符串形式输出打印杨辉三角数。
def count_yanghui():
"""计算每一行杨辉三角数"""
a=[1]
while True:
yield a
a=[sum(i) for i in zip([0]+a,a+[0])]
def control_circulation(max_num):
"""由用户决定打印几行杨辉三角"""
n=0
for x in count_yanghui():#注意此处x表示整个a列表,不是a列表的一个个元素
a_cp=x.copy()#不能直接操作a列表,因为如果a和a_copy在同一个内存地址,后续算法会出错
for i in range(len(a_cp)):
temp=str(a_cp[i])
a_cp[i]=temp#首先转换为字符串列表
str_a_cp=' '.join(a_cp).center(50)#列表元素以空格分开转换为字符串并使用空格填充至长度 width 的新字符串,接着转换为字符串输出
print(str_a_cp)
n+=1
if n==int(max_num):
break
if __name__=="__main__":
n=input("请输入需要打印的杨辉三角行数:")
control_circulation(n)
输出:
请输入需要打印的杨辉三角行数:6
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
代码释疑:
唯一的改变就是在control_circulation()函数将直接打印a列表修改为稍微排版好的字符串(仍是一行一行的输出)。具体解释读者可在代码中查看。