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

文章介绍了如何使用Python生成杨辉三角形的前n行。方法一是通过二维数组,初始化所有元素为1,然后根据每个数由其上一行的两个数相加得到的规则进行计算。方法二是利用排列组合数的递归关系,通过递归函数计算每一行的每个数。对于较小的n值这种方法可行,但效率较低,不适合大n值的情况。
摘要由CSDN通过智能技术生成

问题描述

杨辉三角形又称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中的每一个整体的列表,再在每一个列表里遍历所有的元素进行输出,并且以空格隔开,每遍历完一个列表进行换行。

方案二:

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

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

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

顺便提一下

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

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=' ')

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值