计算杨辉三角前6行(升级版),list实现

    值如下:
    [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1]]
  • 思路:

        上一个实现的思路,下一行的数字是基于上一行的数字求得而来,那么则只需要使用两
        个内存空间,分别来保存这两行数字.一个保存上一行的数字,另一行则保存求得的下一
        行数字.一轮循环后,新生成的下一行变成了旧行,新行清空重新计算并填充.
  • 优化思路:

        直接开辟一个足够大的内存空间,在此内存空间中来模拟旧行和新行的关系,如直接将新行的内容覆盖旧行的内容.
        优点:
            内存空间的消耗减少,时间复杂度不比上一个实现差.
  • 代码实现:

    l1=[1]*6          # 开辟一个长度为6的列表
    print(l1[:1])         
    print(l1[:2])
    for i in range(2,6):
        a=[1]                       # 定义及重置
        for j in range(1,i//2+1):          
            a.append(l1[j])         # 将用于计算的数附加至此列表
            if len(a)>2:            # 列表长度大于2时,进行元素处理
                a[0]=a[1]
                a[1]=a[2]
                a.remove(a[2])
            l1[j]=a[0]+a[1]
            if i!=2j:
                l1[i-j]=l1[j]
        print(l1[:i+1])             # 根据切片,只打印所需部分
  • 实现想法:

        上一行与下一行的关系,无非就是两个数相加所得结果是下一行的某一值.在同一列表
        中操作,需要防止生成的新值将用于计算的旧值覆盖.因此需要将用于计算的值保存下
        来.
        我使用的是用列表保存,而且此列表只需要两个值即可,当列表长度超过了3,则代表第
        一个用于计算的值已经使用完,便用后面的两个值覆盖掉.

  • 更优方案:

        每次计算前将要被覆盖的值保存至一个变量中,在下次计算时使用此变量和下一个索引
        的值进行相加同样可以求出此结果.
        优点:
            此处变量比列表效率更高
        注意:
            这个变量要在原值修改之前保存
            在下一轮的计算之前,变量的值没有改变
  • 代码实现:

    l1=[1]*6                  # 开辟长度为6的列表
    print(l1[:1])             # 1,2行做特殊行处理
    print(l1[:2])
    for i in range(2,6):    
        a=1                      
        for j in range(1,i//2+1):       # 将求下一行值分为两步     
            val = l1[j]+a         # 第一步求值
            a = l1[j]             # 将原值先保存至a
            l1[j] = val           # 第二步赋值
            if i!=2j:
                l1[i-j]=l1[j]
        print(l1[:i+1])


  • 实现想法:

        将求值的过程分成两步,先把a和索引对应的值的和保存至变量val中,再把即将要被覆
        盖的值保存至a,最后在将val的值覆盖至事先保存的变量位置.