简单的杨辉三角解法

简单的杨辉三角解法_第1张图片

杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。

https://baike.baidu.com/item/杨辉三角/215098?fr=aladdin

1.两端补零法

n = int(input('>>'))  
ls1 = [[1]]  
for i in range(1, n):  
    pre = [0] + ls1[i-1]+[0]    # 两端补零  
    cur = []  
    for j in range(i+1): 
        cur.append(pre[j] + pre[j+1])  
    ls1.append(cur)  
print(ls1)  

2.末尾补零法

n = int(input('>>>'))
ls1 = [[1]]  

for i in range(1, n):  # 边界取n,计算行为n,计算行的上一行为n-1  
    ls2 = ls1[-1]+[0]  # ls2取出来加个0,作为计算用  
    ls3 = []  
    for j in range(0, i+1):  # 边界为i+1是因为ls2多了一项,共有n+1项,索引有n个,需要取到边界n项  
        s = ls2[j-1] + ls2[j]  
        ls3.append(s)  
    ls1.append(ls3)  
print(ls1)  

3.利用上一行打印下一行

print("请输入需要打印的行号")  
num = int(input(">>>"))  
l1 = [1]  
if num == 1:  
    print(l1)  
else:  
    for j in range(num-1):              # 需要打印的行号
        l2 = [1]                        # 每次迭代,将l2初始化
        for i in range(len(l1)):        # 此循环是将利用上一次列表生成的元素进行迭代,
            if i != 0:                  # 排除索引为0的元素1
                a = l1[i-1] + l1[i]  
                l2.append(a)  
        l2.append(1)  
        l1 = l2                         # 将l2的值赋值定义给l1,后面给循环迭代使用
print(l2)  

4.对称法 :

  • 一次性开辟出空间,先算出前一半的值,然后对称赋值
  • 一次性开辟出第n行所需空间然后算值替换,比循环迭代append添加更高效。每次只推算一半,时间复杂度更低
  • 但是对称打印还是依赖于上一行
n = int(input('>>>'))  
ls1 = [[1]]  
for i in range(2, n+1):  
    ls2 = ls1[-1] + [0]          # 设置一个新列表,不影响原列表  
    ls3 = [1] * i                # 第n行就有n项  
    for j in range(0, (i+1)//2):      # 取ls2的中间位置为终点位置  
        ls3[j] = ls2[j-1] + ls2[j]  
        ls3[-j-1] = ls3[j]           # 终点位置两边是对称的  
    ls1.append(ls3)  
print(ls1)  

5.单行覆盖

  • 一次性开辟好n个长度的空间,每次推算新行时不生成新的列表,在原来的基础上赋值替换。
n = int(input('>>>'))  
row = [1] * n               # 一次性开辟空间

for i in range(n):  
    z = 1  
    for j in range(i//2):  
        a = z + row[j+1]    # 计算出来的新值会影响后面的计算,使用临时变量置换一下
        z = row[j+1]  
        row[j+1] = a  
        row[i-j-1] = a      # 对称赋值 ,用索引找到i,j的关系   row[j+1]=row[i-j-1]
print(row)  

6.根据C=n!/(m!*(n-m)!)求解,

  • 第一步先算出n!阶乘,
  • 第二步算出m!的阶乘,用一列表收集数据(此列表里的数也是(n-m)!的阶乘,只是反方向取数,n!的阶乘就是此列表中最后的大数)
  • 第三步利用公式求解,用列表收集
n = int(input("请输入行号"))-1
z = 1
ls1 = []
ls2 = [1]*(n+1)

for i in range(1, n+1):
    z *= i
    ls1.append(z)
for j in range(0, n-1):
    s = ls1[-1]//(ls1[j]*ls1[-j-2])
    ls2[j+1] = s
print(ls2)

你可能感兴趣的:(简单的杨辉三角解法)