十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
按照你的要求用字符串类型编写的杨辉三角的Python程序如下
创新互联专业为企业提供临沂网站建设、临沂做网站、临沂网站设计、临沂网站制作等企业网站建设、网页设计与制作、临沂企业网站模板建站服务,十余年临沂做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
def printYangHui(n):
for i in range(1,n+1):
if i==1:
s="1"
if i==2:
s="1,1"
if i2:
s1=""
begin=0;
for j in range(0,(i-3)+1):
begin1=s.find(",",begin)
begin2=s.find(",",begin1+1)
if begin2==-1:
begin2=begin1+2
s1=s1+str(int(s[begin:begin1])+int(s[begin1+1:begin2]))+","
begin=begin2-(begin2-begin1-1)
s="1,"+s1+"1"
print(s)
n=int(input())
printYangHui(n)
源代码如下(注意源代码的缩进)
杨辉三角,是二项式系数在三角形中的一种几何排列。
前提:每行端点与结尾的数为1.
每个数等于它上方两数之和。
每行数字左右对称,由1开始逐渐变大。
第n行的数字有n项。
第n行数字和为2n-1。
第n行的m个数可表示为
C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
第n行的第m个数和第n-m+1个数相等
,为组合数性质之一。
每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即
C(n+1,i)=C(n,i)+C(n,i-1)。
(a+b)n的展开式中的各项系数依次对应杨辉三角的第(n+1)行中的每一项。
将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是第4n+1个斐波那契数;将第2n行第2个数(n1),跟第2n-1行第4个数、第2n-2行第6个数……这些数之和是第4n-2个斐波那契数。
将各行数字相排列,可得11的n-1(n为行数)次方:1=11^0;
11=11^1;
121=11^2……当n5时会不符合这一条性质,此时应把第n行的最右面的数字”1”放在个位,然后把左面的一个数字的个位对齐到十位…
…,以此类推,把空位用“0”补齐,然后把所有的数加起来,得到的数正好是11的n-1次方。以n=11为例,第十一行的数为:1,10,45,120,210,252,210,120,45,10,1,结果为
25937424601=1110。
完整代码:
#!/usr/bin/python
#coding=utf-8
#
__author__
=
'cy'
#输出杨辉三角数值表
def
triangle(num):
#初始表值为[1]
triangle=[[1]]
#添加i个值([1])至triangle表,eg:[1]*3,triangle=[[1],
[1],
[1]]
for
i
in
range(2,
num+1):
triangle.append([1]*i)
#改变triangle表的值,eg:
#当num=5时,i取5,j取3
#triangle[4][1]
=
triangle[3][1]+triangle[3][0]
#triangle[4][2]
=
triangle[3][2]+triangle[3][1]
#triangle[4][3]
=
triangle[3][3]+triangle[3][2]
#相当于triangle表的第4位的值(这里的值为一个表)的第1,2,3位值等于第3位的值(这里的值也是一个表)的第1,2,3位值和0,1,2的值分别相加(即错位相加)。
for
j
in
range(1,
i-1):
triangle[i-1][j]
=
triangle[i-2][j]+triangle[i-2][j-1]
return
triangle
#格式化输出(输出的是一个表)
def
printtriangle(triangle,
width):
#列宽
column
=
len(triangle[-1])*width
for
sublist
in
triangle:
result
=
[]
for
contents
in
sublist:
#控制间距
result.append('{0:^{1}}'.format(str(contents),
width))
#控制缩进,{0:^{1}}:空格在两边补齐空位‘^’居中对齐,‘:’号后面带填充的字符
print('{0:^{1}}'.format(''.join(result),
column))
#启动函数
if
__name__
==
'__main__':
#输入整数
num
=
int(input('How
many
rows
do
you
want:'))
#打印信息
"The
triangle
rows
as
follows:"
triangle
=
triangle(num)
#列宽
width
=
len(str(triangle[-1][len(triangle[-1])//2]))+3
printtriangle(triangle,
width)
triangles里用到了yield,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 triangles(5) 不会执行 triangles函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield L 时,triangles函数就返回一个迭代值,下次迭代时,代码从 yield L 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
1 那个2去哪了
你看else语句 L1 = [1,1]每次L都是基于这个L1生成的 比如L=[1,2,1] 那么下一个L1就是[1,3,3,1],下一句L = L1 所以每次都是新的L1生成
2 画红圈的地方应该是和L1.insert(i,L[i-1+i])意思一样
不一样,插入的值是两个数的和
def triangles(max):
L = [1]
n = 0
while(nmax):
n = n+1
if(n == 2):
L=[1,1]
yield L
else:
i = 1
L1 = [1,1]
while(i=n-2):
L1.insert(i,L[i-1]+L[i])
i=i+1
L = L1
yield L
for n in triangles(5):
print n
程序输出需要实现如下效果:
[1]
[1,1]
[1,2,1]
[1,3,3,1]
......
方法:迭代,生成器
123456789101112131415161718192021
def triangles() L = [1] while True: yiled L L =[1] + [L[i] + L[I+1] for i in range(len(L)-1)] + [1] n = 0 for t in triangles(): print(t) n += 1 if n == 10: break
实现逻辑:
1.由于yield为生成器中断输出,所以有了第一个次输出为[1]
2.继续while下面的yield后的循环,此时list长度为1,将其代入L中的len(L),得出[L[i]+L[i+1] for i in range(1-1)]得出为空值,所以yield L输出为[1,1]
3.此时len(L)值为2,代入得出[L[i]+L[i+1] for i in range(2-1)]为[L[i]+L[i+1] for i in range(1)],i能取值为0,代入后为[L[0]+L[1]],而L[0]和L[1]的值均为1(有上面结果可知),所以输出结果为[1,2,1]
4.由第三条可知此时len(L)值为3,代入得出[L[i]+L[i+1] for i in range(2)],i取值为0和1,通过循环输出有两个值,均为3,分别由[L[0]+L[1]],[L[1]+L[2]]
以此类推即可