"""
1
/ \
1 1
/ \ / \
1 2 1
/ \ / \ / \
1 3 3 1
/ \ / \ / \ / \
1 4 6 4 1
/ \ / \ / \ / \ / \
1 5 10 10 5 1
杨辉三角(贾宪三角、帕斯卡三角):
1.杨辉三角,是二项式系数在三角形中的一种几何排列,把组合数内在的一些代数性质直观地从图形中体现出来,是一种
离散型的数与形的结合
2.概述:
(1)每行端点与结尾的数为1
(2)每个数等于它上方两数之和
(3)每行数字左右对称,由1开始逐渐变大
(4)第n行的数字有n项
(5)第n行的m个数可以表示为C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数
(6)第n行的第m个数和第n-m+1个数相等,为组合数性质之一
(7)每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行第i-1个数与第i个数之和,这也是
组合数的性质之一。即C(n+1,i) = C(n,i-1) + C(n,i)
(8)(a+b)的n次方的展开式中的各项系数以此对应杨辉三角的第(n+1)行中的每一项
(9)将第2n+1行第1个数,第2n+2行第3个数,第2n+3行第五个数......连成一线,这些数的和是第4n+1个斐波拉契数;
将第2n行第2个数(n>1),第2n-1行第4个数,第2n-2行第6个数......这些数的和是第4n-2个斐波拉契数
(10)将第n行的各项数值,分别乘以10的列数m-1次方,然后把这些数值相加的和等于11的n-1次方。
编码思路:
1.通过参数明确每行前面的空格数
2.每行元素个数等于行数,其中首尾都是1
3.第n行从第2个数开始到n-1个数,都是第n-1行对应前两个数之和(n>2)
通过递归求值
"""
def yanghui_triangle(n):
for i in range(1, n+1): #1 - n 外层循环行数
for sp in range(n-i): #每行前面的空格数
print(end = "\t")
for j in range(1, i+1): #1 - i 内层循环每行个数
if j == 1 or j == i: #首尾都是1
print(1, end = "\t\t")
else: #计算非首尾位置的数
print(get_value(i, j), end = "\t\t")
print()
def get_value(x, y):
if y == 1 or x == y: #首尾为1
return 1
else:
return get_value(x-1, y-1) + get_value(x-1, y) #递归来求对应位置的数
yanghui_triangle(7)
运行结果:
使用生成器实现:
def yanghui_triangle(n):
for i in range(1, n+1): #1 - n 外层循环行数
for sp in range(n-i): #每行前面的空格数,并放入生成器中
yield "\t"
for j in range(1, i+1): #1 - i 内层循环每行个数
if j == 1 or j == i: #首尾都是1,将数字和空格放入生成器
yield "1\t\t"
else: #计算非首尾位置的数,将数字和空格都放入生成器
yield str(get_value(i, j)) + "\t\t"
yield "\n"
def get_value(x, y):
if y == 1 or x == y: #首尾都是1
return 1
else:
return get_value(x-1, y-1) + get_value(x-1, y) #递归来求对应位置的数
for i in yanghui_triangle(7): #迭代生成器
print(i, end = "")