楊輝三角-list實現(優化)

計算楊輝三角前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的值覆蓋至事先保存的變量位置.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章