python杨辉三角两种写法详解

一般写杨辉三角都是用二维数组,通过二维数组的下标,可以非常容易的计算出下一行结果。

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]

解法一:嵌套列表

先找规律,杨辉三角有n行,第一行有1个数,第二行有2个数,第三行有3个数…每一行的元素个数与行号大小相等,可以用嵌套列表存储每一行:

L=[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1]]

从上图的直角三角形中找规律:其中规律为:
L[x][y]=L[x-1][y]+L[x-1][y-1] :x即行号,y即列号,本行的一个元素值=上一行同列元素值+其左边元素值

还要先做一点特殊处理:把每一行的行首和行为置1,只计算行中间部分(因为只有行中间部分符合规律)

# 杨辉三角一般解法
def triangle(n):
    l=[] #用来存储所有行的返回列表
    for i in range(n):
        if i==0:
            l.append([1])  # 第一行
        elif i==1:
            l.append([1,1])#第二行
        #第三行以后.....
        else:
            y = []  # 存储一行,每次清空
            for j  in range(i+1):
                if j==0 or j==i:
                    y.append(1)#行首和行末为1
                else:
                    y.append(l[i-1][j]+l[i-1][j-1])
            l.append(y)#放入所有行存储列表中
    return l
n=12 #行数12
x=triangle(n)
for i in range(len(x)):#逐行打印结果
    print(x[i])

其结果就是开篇的直角杨辉三角了,如果要打印成等腰三角形,那在输出格式上要设置一下
字符串有一个center函数,可以令字符串居中显示,且两边可以填充符号,这里就填充空格
利用循环,把每一行转换成字符串,然后输出此行:
这里直接就调用上面写的杨辉三角函数:

#杨辉三角输出呈等腰三角形
x=triangle(n)
for i in range(len(x)):
    #字符串有center函数,可以居中打印
    s=str(x[i])
    print(s.center(n*10))#域宽n*10,两边填充空格

结果如下:

C:\python3.8\PyCharmLocation\venv\Scripts\python.exe                      [1]                                                                          
                                                                        [1, 1]                                                                        
                                                                      [1, 2, 1]                                                                       
                                                                     [1, 3, 3, 1]                                                                     
                                                                   [1, 4, 6, 4, 1]                                                                    
                                                                 [1, 5, 10, 10, 5, 1]                                                                 
                                                               [1, 6, 15, 20, 15, 6, 1]                                                               
                                                             [1, 7, 21, 35, 35, 21, 7, 1]                                                             
                                                           [1, 8, 28, 56, 70, 56, 28, 8, 1]                                                           
                                                        [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]                                                                                                                                                  
                                        
                         

这只是一种粗糙的打印方法,越到后面队型越崩坏,更细致的格式输出方法还没有写出。

解法二:用zip方法解

杨辉三角还有一个特性:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]:
由上一行(第二行)前面加一个0组成的列表,去缝合(zip)上一行后面加一个0组成的列表,效果如下:
由第二行11得到第三行:

  		011
	   +110
	 =  121

由第三行121得到第四行:
+0121
+1210
=1331

可以利用zip方法将两个列表交错缝合,在用sum方法将缝合后的元组结果算出
python中的zip方法效果是:将两个序列缝合起来,并返回一个由元组组成的序列
如:
序列1: l1=[1,2,3,4,5]
序列2: l2=[6,7,8,9,10]
x=zip(l1,l2)
print(list(x))
结果为:[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)],用sum将(1,6)结果相加得出为7

#杨辉三角
def f4(n):#n 为行数
    l1 = [1]#用于存放单行结果
    l2 = []#用于存放所有行的结果
    x = [] # 用于存放sum结果的列表,需要每次清空
    i = 0
    while i < n:
        l2.append(l1)
        print(l1)
        for t in zip([0] + l1, l1 + [0]): #011+110=121,0121+1210=1331
            x.append(sum(t))#通过两次sum,[(0,1),(1,0)]=[1,1]
        l1 = x
        x = []  # 清空
        i += 1
f4(22)
C:\python3.8\PyCharmLocation\venv\Scripts\python.exe C:/python3.8/PyCharmLocation/venv/7/21/question4.py
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]
[1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1]
[1, 12, 66, 220, 495, 792, 924, 792, 495, 220, 66, 12, 1]
  • 37
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值