您好,登录后才能下订单哦!
杨辉三角
的一些理解:
感觉杨辉三角的实现至少在前两行是特殊的。在后面的几行代码中我是这样想的,可以用第n项加第n+1项。两边再加上1就可以了罢。两边如果都这么做的话可以实现对称的操作。
让我们来实现吧。在实现的过程中想套用一层循环发现难以实现,用两层试试看。
yh=[[1],[1,1]]
for i in range(2,6):
line=[1]
ls=yh[i-1]
for j in range(len(ls)-1):
line.append(ls[j]+ls[j+1])
line.append(1)
yh.append(line)
print(yh)
#打印n行的杨辉三角
a=int(input('请输入第几行'))
y=[[1],[1,1]]
for i in range(a-2):
n=y[i+1]
long=len(n)
line=[1]
for j in range(long-1):
line.append(n[j]+n[j+1])
line.append(1)
y.append(line)
print(line)
关于补零的一些想法,在杨辉三角当中,可以将左右两边当成多了一个零,在进入下一行的时候就可以看成0+1=1,同理右边也是一样,在实际写代码中,开始确实是左边多一个[0]
,右边多一个[0],但实际操作下来,左边的[0]可以省去,因为在python当中是有独特的负索引机制,在右边的最后一项可以看做是[-1]项,这样从0开始迭代的话可以从i-1开始
迭代,是一个python的独特思想。
y=[[1]]
for i in range(1,6):
n=y[i-1]+[0]
l=[]
for j in range (i+1):
l.append(n[j-1]+n[j])
y.append(l)
print(y)
如果用独特的负索引的话,用对称性也是可以做出来的也是从-1项开始做起一直做到中间,这就需要在一开始的时候就创建一个刚刚好的列表空间,然后将元素一个一个填充进去
,这种方法就叫做对称法
y=[[1]]
for i in range(5):
n=y[i]+[0]
line=[1]*(i+2)
for j in range((i+2)//2+1):
line[j]=n[j-1]+n[j]
line[-j-1]=line[j]
y.append(line)
print(y)
其实有这个想法之后实现代码并不困难,其实这种方法只是一种思想,这更多是为最后一种方法铺路,前面三种方法可以看出都是引用一个新列表然后将新列表填充到旧列表当中,如果将旧列表直接copy一个新列表这样可以省去许多冗余量,我们称这第四种方法为单列覆盖法。
y=[1]*6
for i in range(6):
long=6-i
tmp=1
for j in range (1,i//2+1):
val=y[j]+tmp
tmp=y[j]
y[j]=val
y[-long-1]=val
print(y[:i+1])
在这里引用了一个中间变量tmp因为如果不引用的话会造成数据覆盖,会有人在实际操作中会判断是奇数列还是偶数列,但是我们在实验中可以看到其实判断是多余的,因为完全可以在多余列覆盖即可。
到现在杨辉三角就差不多完成了。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。