码迷,mamicode.com
首页 > 其他好文 > 详细

杨辉三角

时间:2018-08-13 10:46:58      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:完全   思路   修改   可变   需要   代码   杨辉三角   app   构造   

##########杨辉三角思路########

             1      n=0

   1 1     n=1

  1 2 1    n=2

 1 3 3 1   n=3  中间项的数量= n-1

  1 4 6 4 1  n=4

1 5 10 10 5 1 n=5   共六项 前六行

第一行和第二行是特殊项 不做讨论 直接定义

num = [1,[1,1]]

从第二行开始,每一行的首尾都是1 中间项 为前一行列表的 两个相邻的数字之和

            num = [1,[1,1]]

for i in range (2,6): ##取 1到5 

为了构造新的一行,需要提取出num列表中的前一项 也就是 num[i-1]

               list.up = num[i-1] ### [1,1]

拿到这个值后看怎么用这个值,通过分析我们发现每一行的列表都有一个性质,就是首尾都为1 [1,....,1]

所以我们需要首先构造出[1,....,1]

                new.list = [1]

  # 然后在这个 new.list 后边追加 中间项 再追加[1]

 所以这时候要分析中间项; 中间项是一个可迭代的项 和n有关系 不是定值  所以需要使用循环来完成构造

                   for j in range (0,i-1):           取值范围的确定是由小范围值确定的通过[1,1]-->[1,2,1] 可知:

      midd = pre [j] + pre [j+1]

 中间项和第一项都有了以后开始追加 new.list.append(midd)

                                  new.list.append(1)

                                  num.append(new.list)

 

代码:

num = [1,[1,1]] 

for i in range (2,6):                                   

    pre = num[i-1]

    cur = [1]

    for j in range (0,i-1):

        cur.append(pre[j] + pre [j + 1]) 

    cur.append(1)

    num.append(cur)

print (num)

另一种表达形式: (cur是一个可变的列表,可以随时在任何地方修改该列表的值)

num = [] 

for i in range (6):

    cur = [1]

    num.append(cur)

    if i == 0: continue

    pre = num[i-1]

    

    for j in range (i-1):

        cur.append(pre[j] + pre [j + 1]) 

    cur.append(1)

print (num)

另一种表达形式:  这个方法是 我先构造一个 num=[[1]] 然后通过i的值来判定到底要不要再尾部追加 如果 i<0 也就是第一行 那就直接输出[1],如果i>1了 那就找中间项

num = [] 

for i in range (6):

    cur = [1]

    num.append(cur)

    #if i == 0: continue

   # pre = num[i-1]

    

    for j in range (i-1):

        cur.append(num[i-1][j] + num[i-1][j + 1]) 

    if i > 0 :

        cur.append(1)    

print (num)  

######## 方法二#########################

 补零法:   1 0     n= 0

          1 1 0

1 2 1 0

1 3 3 1 0

       1 4 6 4 1 0  n= 5

结题思路:

 将每行列表进行补零 可以总结出规律如下 

           第一个数字 :上一行(num[-1]+num[0]) 

  第二个数字:  上一行(num[1]+num[2])

  ..................................

  最后一个数字: 上一行 (num[i-1]+num[-1])

 首先 需要构造一个原始列表: num = [[1],[1,1]]

  第三行的前一项 表示为 pre = num [i-2]  --> [1,1]

  然后给这一行的尾部加零,构造一个新的列表,但是我们需要最后显示的列表中不能有零的存在,所以必须构造一个新的列表。

                         newlist = pre . copy ()

newlist .append (0)           也可以直接表示为 newlist = pre + [0]

mid =[ ]                        创造一个新列表 来放新列表的内容

构造新数列后,需要用构造下一行列表, 根据规律可以得到 i=2 需要计算三次 所以要循环 i+1 次 

                         for  j in range (i+1):

      mid.append(newlist[j-1]+newlist[j])


代码:   

     n = [[1],[1,1]]

for i in range (2,6):

  pre = n[i-1] + [0]

# pre=pre.copy()

# pre.append(0)

  mid = []

for j in range (i+1):

  mid.append(pre[j-1]+pre[j])

num.append(mid)

print(num)   

 

################方法三###################

对称性: 

             1        n=0

   1 1       n=1

  1 2 1      n=2

 1 3 3 1     n=3  中间项的数量= n-1

  1 4 6 4 1    n=4

1 5 10 10 5 1 n=5   共六项 前六行

  通过分析可知,杨辉三角可以看做是关于中点对称的列表的集合,遇到对称性列表问题时,同时通过观察可知该列表的规律,可以采用一次性开辟对应空间的列表,然后在列表中增删元素

      n = 6

 taiangel = [[1],[1,1]]

 for i in range (2,n):

    row = [1] * (i+1)  ###通过规律可知 第3行 即n=2 该行共有3个元素 所以一次性开辟 [1] * (i+1) 个元素

        pre = taiangel[i-1]

     =======================到此为止,已经可以成立一个新的列表,元素站位已经有了,差的是把先关的值填进去===================================================

通过观察可知每一行要添加的元素是由规律的 n=2 要添加1个元素

                                         n=3 要添加1个元素 (因为 3和3 可以当一个元素 利用对称性完成)

 n=4 要添加2个元素 (4和6两个元素)

 n=5 要添加2个元素  (5和10两个元素)

 。。。。。。。。。。。。。。

 得出结论: j的迭代次数为 (n//2) 

    for j in range (i//2):

                                      val= pre[j] + pre[j+1] ###计算中间项的值 但是这里没有考虑到n=3这样的特例,只添加一个元素但是该元素要关于中点对称;

                              i=2 j=1 val= pre[0] + pre[1] = 1+1 =2   row[1]

                              i=3 j=1 val=pre[0]+pre[1]=3             row[1]

                              i=4 j=2 val=pre[0]+pre[1]=4             row[1]

                              val=pre[1]+pre[2]=6             row[2]    row[j+1]

         val = pre[j] + pre[j+1]

row[j+1] = val                      程序进行到这里的时候还没有完全成功 对称元素就只更改了一项 另一项还是1没有改。

         if i != 2j :

             row[-j-2] = val              通过判定 当 i!= 2j 时  倒数第二 第三个元素 要和val相等 

    taiangel.append(row)

print(taiangel)

 相关代码:

 ## 杨辉三角对称性 

n = 8

triangle = [[1],[1,1]]                                   1          i=0    第一行   i+1

for i in range (2,n):                                  1   1        i=1

    row = [1] * (i+1)                                 1  2  1       i=2

    pre = triangle[i-1]                              1  3  3  1     i=3

    for j in range (i//2):  #2                     1  4  6  4  1    i=4    第五行   i+1

         val = pre[j] + pre[j+1] #4                   需要想 i 和 j 的关系 j还要表示row[j] j==1  现在 i=2 j=1//2   for j in range (2):

        row[j+1]=val                                                                                            row(j+1) =  pre(j)+pre(j+1)

        if i != 2j :  #j=0                                                                                           

            row[-j-2] = val 

    triangle.append(row)

print(triangle)


杨辉三角

标签:完全   思路   修改   可变   需要   代码   杨辉三角   app   构造   

原文地址:http://blog.51cto.com/12950054/2158575

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!