当前位置:   article > 正文

蓝桥杯基础练习:杨辉三角(python)_杨辉三角 蓝桥杯

杨辉三角 蓝桥杯

问题描述

杨辉三角形又称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:

  1. n=int(input())#输入的数字,最后就会有n行,并且最后一行有n个数
  2. arr=[]
  3. for i in range(n):
  4. arr.append((i+1)*[1])
  5. #print(arr) #用来观察建立的二维数组是否正确
  6. #当n=5时,输出为:[[1], [1, 1], [1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1, 1]]

然后就可以进行计算,直接从第三行开始计算就可以:

  1. for row in range(2,n):
  2. for col in range(1,row):
  3. arr[row][col]=arr[row-1][col-1]+arr[row-1][col]
  4. #print(arr)#用来检测出结果

下面是输出:

  1. for arr_in in arr:
  2. for arr_in_in in arr_in:
  3. print(arr_in_in,end=' ')
  4. print()

首先遍历arr中的每一个整体的列表,再在每一个列表里遍历所有的元素进行输出,并且以空格隔开,每遍历完一个列表进行换行。

方案二:

就是按照每一行的数字对应的是相应的排列组合

我们发现如果刚开始记为第一行,那么每一行对应的排列组合数的底数为该行的行数减1

我们可以先想办法计算排列组合数,排列组合的公式:

顺便提一下

编写代码可以参考定义(利用递归来写):

  1. def rec(i,j):
  2. if j==i:
  3. return 1
  4. elif j==1:
  5. return i
  6. else:
  7. return rec(i-1,j-1)+rec(i-1,j)

然后再用两个for循环来控制行数值的增长和每一行的指数(排列组合中的指数)增长

  1. for i in range(n):#控制 行数增长
  2. if i==0:
  3. print(1)
  4. else:
  5. for j in range(i,-1,-1):#计算每一行的数值
  6. if j==0:
  7. print(1)
  8. else:
  9. print(rec(i,j),end=' ')

for j in range(i,-1,-1)

因为递归函数中是逐渐递减的,所以这里控制指数从最大值向1逐渐递减,最小值不能为0,

括号中的 i 是“最大值”;中间的 -1 是“最小值“,但是取不到,所以这里的最小值为0;最后的 -1 是“步长值”,意味着每次减一;如果第三个数是 -2,意味着每次减二;如果第三个数是 2 ,意味着每次加二,但是前面的起始值和最大值也要保证正确。

完整代码:

  1. def rec(i,j):
  2. if j==i:
  3. return 1
  4. elif j==1:
  5. return i
  6. else:
  7. return rec(i-1,j-1)+rec(i-1,j)
  8. n=int(input())#输入的数字,最后就会有n行,并且最后一行有n个数
  9. for i in range(n):#控制 行数增长
  10. if i==0:
  11. print(1)
  12. else:
  13. for j in range(i,-1,-1):#计算每一行的数值
  14. if j==0:
  15. print(1)
  16. else:
  17. print(rec(i,j),end=' ')

注:这个方法运行会比较满,用来做蓝桥杯的答案会超时

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/439332
推荐阅读
相关标签
  

闽ICP备14008679号