杨辉三角(Python)
杨辉三角性质:每行首位数字都是1每行中间的各项数字都是它肩上两个数字的和第n行的数字有n个第n行的项数总比第n-1行多一个num=int(input("请输入您需要打印的杨辉三角的层数:"))list1=[]for i in range(num):list2=[]if i==0:list2=[1]elif i==1:list2=[1,1]else:passli...
杨辉三角性质:
- 每行首位数字都是1
- 每行中间的各项数字都是它肩上两个数字的和
- 第n行的数字有n个
- 第n行的项数总比第n-1行多一个
解题思路:
- input来读取用户输入的行数。
- 创建两个列表list1和list2,list1用于存放最后的结果(结果是二维列表),list2用于存放每一行的数字。
- 根据性质输出结果,首尾是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
注意事项:
- 最后若发现输出出现拥挤,可以增加相邻数字之间的宽度(format格式化方法)
- 若输出结果依然是直角三角形,但是前面依然有空格,看看是否是space在每次循环后是否递减
- 最后希望大家下次写注释的时候不要在里面撒谎,中国人不骗中国人!
更多推荐
所有评论(0)