问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行。
输入格式
输入包含一个数n。
输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
数据规模与约定
1 <= n <= 34。
解决方法:
方案一:
运用二维数组,(以样例输出参考)因为每一个数都是由他的 上面一位 和 他的 左上位 的数字相加得到的。以第四行的第二个三为例(下标为[3,2]),它是由下标为:[2,2] 和[2,1]相加得到的。
因为前两行和每一行的两边的数都为 1 ,那么可以在开始将二维数组中的所有数值初始化为1:
n=int(input())#输入的数字,最后就会有n行,并且最后一行有n个数
arr=[]
for i in range(n):
arr.append((i+1)*[1])
#print(arr) #用来观察建立的二维数组是否正确
#当n=5时,输出为:[[1], [1, 1], [1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1, 1]]
然后就可以进行计算,直接从第三行开始计算就可以:
for row in range(2,n):
for col in range(1,row):
arr[row][col]=arr[row-1][col-1]+arr[row-1][col]
#print(arr)#用来检测出结果
下面是输出:
for arr_in in arr:
for arr_in_in in arr_in:
print(arr_in_in,end=' ')
print()
首先遍历arr中的每一个整体的列表,再在每一个列表里遍历所有的元素进行输出,并且以空格隔开,每遍历完一个列表进行换行。
方案二:
就是按照每一行的数字对应的是相应的排列组合数
![](https://i-blog.csdnimg.cn/blog_migrate/f38356be2fe18f4001e4da3d76f57a6d.jpeg)
我们发现如果刚开始记为第一行,那么每一行对应的排列组合数的底数为该行的行数减1
我们可以先想办法计算排列组合数,排列组合的公式:
![](https://i-blog.csdnimg.cn/blog_migrate/1a5e34b2b1fd4d2bd09e581349dce2e6.jpeg)
顺便提一下
编写代码可以参考定义(利用递归来写):
![](https://i-blog.csdnimg.cn/blog_migrate/4625efdc6a5f6f75983c1c2787feea77.jpeg)
def rec(i,j):
if j==i:
return 1
elif j==1:
return i
else:
return rec(i-1,j-1)+rec(i-1,j)
然后再用两个for循环来控制行数值的增长和每一行的指数(排列组合中的指数)增长
for i in range(n):#控制 行数增长
if i==0:
print(1)
else:
for j in range(i,-1,-1):#计算每一行的数值
if j==0:
print(1)
else:
print(rec(i,j),end=' ')
for j in range(i,-1,-1)
因为递归函数中是逐渐递减的,所以这里控制指数从最大值向1逐渐递减,最小值不能为0,
括号中的 i 是“最大值”;中间的 -1 是“最小值“,但是取不到,所以这里的最小值为0;最后的 -1 是“步长值”,意味着每次减一;如果第三个数是 -2,意味着每次减二;如果第三个数是 2 ,意味着每次加二,但是前面的起始值和最大值也要保证正确。
完整代码:
def rec(i,j):
if j==i:
return 1
elif j==1:
return i
else:
return rec(i-1,j-1)+rec(i-1,j)
n=int(input())#输入的数字,最后就会有n行,并且最后一行有n个数
for i in range(n):#控制 行数增长
if i==0:
print(1)
else:
for j in range(i,-1,-1):#计算每一行的数值
if j==0:
print(1)
else:
print(rec(i,j),end=' ')
注:这个方法运行会比较满,用来做蓝桥杯的答案会超时