杨辉三角(Python)

杨辉三角性质:

  1. 每行首位数字都是1
  2. 每行中间的各项数字都是它肩上两个数字的和
  3. 第n行的数字有n个
  4. 第n行的项数总比第n-1行多一个

 解题思路:

  1. input来读取用户输入的行数。
  2. 创建两个列表list1和list2,list1用于存放最后的结果(结果是二维列表),list2用于存放每一行的数字。
  3. 根据性质输出结果,首尾是1,中间的各项数字都是它肩上两个数字的和.

打印前两行:

num=int(input("请输入您需要打印的杨辉三角的层数:"))
list1=[]
for i in range(num):
    list2=[]
    if i==0:
        list2=[1]
    elif i==1:
        list2=[1,1]
    else:
        pass
    list1.append(list2)
print(list1)

在if和elif条件判断中,但i等于0或1即第一层和第二层时直接打印;然后每判断一个判断后,都会将list2添加到list1中.

请输入您需要打印的杨辉三角的层数:2
[[1], [1, 1]]

请输入您需要打印的杨辉三角的层数:5
[[1], [1, 1], [], [], []]

打印num行:

num=int(input("请输入您需要打印的杨辉三角的层数:"))
list1=[]
for i in range(num):
    list2=[]
    if i==0:
        list2=[1]
    elif i==1:
        list2=[1,1]
    else:
        for j in range(i+1):
            if j==0 or j==i:
                list2.append(1)
            else:
                list2.append(list1[i-1][j-1]+list1[i-1][j])
    list1.append(list2)#每存一行的数据(每执行一次判断后),便添加到list1
print(list1)

 在else判断中(打印其他层)创建一个for循环,变量j是为了这一层里面的各个元素,或者说j的索引范围,而这也就是参数i+1的原因.好吧我知道你不理解,假设此时需要打印第四层,i即=3,而且第四层的元素有4个,在列表中的索引值j为0,1,2,3。而i的索引范围却只有0,1,2,因此i+1的目的就是为了匹配j的索引.

在循环中的if判断,当j的取值等于0或i时,即这一层的列表的第一个或最后一个时,将1添加到list2中(参考性质1);在else判断中,将上一层即i-1中的元素取出相加(参考性质2)。

好吧,我知道你还是没有看明白,换个说法:

为什么是i-1:因为i-1是这一层的上一层;假设当前是第3层,则i=2,那么上一层就是i=1即第2层.但是存放第三层杨辉三角的列表是[[1],[1,1],[  ]].而我们要先获取上一层即第二层,即i=1即(i-1)的数据(list1[1])

# 假设当前是第4层,则i=3, 但是列表是[[1], [1, 1], [1,2,1],[  ]].而我们要先获取上一层即第三层, 即i=2j即(i-1)的数据(list1[2]),以此类推

为什么是j-1:此时这个索引是为了获得一层中的各个元素值,而j的定义就是用来表示这一行里面的各个元素值!假设当前是第3层,j的取值范围是0,1,2;此时列表为[[1], [1, 1], [1,2,1]]; 要索引[1,1],但是这索引的这个列表范围是0,1,而刚好要索引的列表范围比j的范围小1

# 假设当前是第4层,j的取值范围是0,1,2,3;此时列表为[[1], [1, 1], [1,2,1],[1,3,3,1]];要索引[1,2,1],但是这索引的这个列表范围是0,1,2;而且第四中的list2中的第一个元素3是第三层的第1个元素(list1[2][0])和第二个元素(list1[2][1])相加而得,以此类推!

#list1(二维列表)
[[1]                      第一层(i=0)
[1, 1]                    第二层(i=1)
[1, 2, 1]                 第三层(i=2,j=0,1,2)
[1, 3, 3, 1]              第四层(i=3,j=0,1,2,3)
[1, 4, 6, 4, 1]]          第五层(i=4,j=0,1,2,3,4)


请输入您需要打印的杨辉三角的层数:4
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1]]

请输入您需要打印的杨辉三角的层数:6
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1]]

 打印杨辉三角(直角三角形):       

for i in list1:
    #print(i)
    for j in i:
        print("{:<4}".format(j),end="")
    print()#每输出一行的元素后就换行

首先遍历list1,因为list1是个二维列表,所以遍历的结果是list1中的各个元素(list1中的小列表),因为print输出默认换行(不换行:print(i,end=""))。此时接着遍历i,然后格式化,左对齐,两个字符之间的宽度为4(宽度自己定义,建议是偶数);print()是每次打印一个列表(list1中的一个元素)后换行,例如打印完第三层后,换行打印第四层,否则都会在同一行。

1     
1     1     
1     2     1     
1     3     3     1     
1     4     6     4     1     


#print(i)的结果
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]

#print(i,end="")的结果
[1][1, 1][1, 2, 1][1, 3, 3, 1][1, 4, 6, 4, 1]

居中杨辉三角:

这次相对上文直角形三角仅仅多了三行,而如何居中,无非就是在每一行的起始数前面空你所需要的长度;

首先引用了一个变量space,他是求list1中的最后一个元素的长度,即最后一层的长度,假设有5层,list1最后一个元素就是[1,4,6,4,1],所以他的长度就是5.至于为什么还要在所求长度后面减一这个不重要,当然你也可以减2,或者不减,重要的是输出调试时看是否对称美观,同时还要参考对应两个字符之间的长度例如格式化方法中的长度4;同时在最后一行的space-=1的作用和当前是一样的,而这也就是为什么可以减也可以不减的原因!

其次,也是本文最难理解的一步.为什么引用space,因为每行前面的空格不是固定的,这是一个动态的效果,因此得需要的一个变量表示,而不是一个固定的数值;同样为什么space要利用最后一层的长度,没有什么别的,主要就是为了美观,不至于出现拥挤,或者不对称的现象!

同样为什么所需空格长度是space*4//2,举例证明:首先在当前直角型杨辉三角中因为相邻两值的长度为4,那么在五层杨辉三角中的最后一行长度(加上空格)就是16,因此第一行所需空格长度为8(因为第一行前面空格的长是最后一行的长度的一半).到了这个时候可能就就有人疑问为什么不直接用16/2呢,这是因为16和8都是你自己数出来的.计算机是不会数的!

在五层杨辉三角中,最后一行的元素有5个,所以space为4;两个数字之间的空格长度也是4,但是要怎么凑出8(用space加上两个数字之间的空格长度的想法是不严谨的)呢?4*4//2=8;公式为(列表长-1)*两数之间的空格长度//2.

 

space=len(list1[-1])-1
for i in list1:
    print(space*4//2*" ",end="")
    for j in i:
        print("{:<4}".format(j),end="")
    print()
    space-=1

完整版:

num=int(input("请输入您需要打印的杨辉三角的层数:"))
list1=[]
assert num>0,"请输入一个正整数!"
for i in range(num):
    list2=[]
    if i==0:
        list2=[1]
    elif i==1:
        list2=[1,1]
    else:
        for j in range(i+1):
            if j==0 or j==i:
                list2.append(1)
            else:
                list2.append(list1[i-1][j-1]+list1[i-1][j])
    list1.append(list2)
print(list1)
space=len(list1[-1])-1
for i in list1:
    print(space*4//2*" ",end="")
    for j in i:
        print("{:<4}".format(j),end="")
    print()
    space-=1
请输入您需要打印的杨辉三角的层数:9
[[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   
              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. 最后若发现输出出现拥挤,可以增加相邻数字之间的宽度(format格式化方法)
  2. 若输出结果依然是直角三角形,但是前面依然有空格,看看是否是space在每次循环后是否递减
  3. 最后希望大家下次写注释的时候不要在里面撒谎,中国人不骗中国人!

  • 24
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值