python教程(九)之特性(8.杨辉三角解法)

期待输出:

[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, 9, 36, 84, 126, 126, 84, 36, 9, 1]

这是个杨辉三角,不知道的可以查一下,使用递归生成器,生成这样的结果

利用生成器

每行端点与结尾的数为1.

排除第一个和最后一个数字,中间部分是上一行相邻两数之和,例如

[1, 4, 6, 4, 1]

[5, 10, 10, 5] 这里去掉两边的[1],5是1+4,10是4+6,10是6+4,5是4+1

按这个规律可以得出这样一个公式用来表示本行的内容:

[1]+[上一行[i]+上一行[i+1]]循环“上一行项数减一次”]+[1]

从第二行就是这个规律,因为第二行不会有中间部分,当我仍需要写出第一行的内容

例如我定义了f=[1],那下一行的内容就是[1]+[f[i]+f[i+1]] for i in range(len(f)-1)]+[1]

接下来在获取新一行上面加一个循环,最后设计一下生成器中yield的位置就可以了

def yang() :
    f=[1]
    while True :
        yield f
        f=[1]+[f[i]+f[i+1] for i in range(len(f)-1)]+[1]
n=0    
for i in yang() :
    if n<10 :
        print(i)
        n+=1
    else :
        break 

这里用迭代器 看看是否能加深你的理解呢

class Hui :
    def __init__(self) :
        self.a=[1]
    def __next__(self) :
        yield self.a
        self.a=[1]+[self.a[i]+self.a[i+1] for i in range(len(self.a)-1)]+[1]    
    def __iter__(self) :
        return self               
a=Hui()
a_num=0
for j in a :
    print(list(j)[0])
    a_num+=1
    if a_num==10 :
        break
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值