pythonチュートリアル(9)の特性(8.楊輝三角解法)

6625 ワード

期待出力:
[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です.
最初と最後の数字を除外します.中間部分は前の行の隣接する2つの数の和です.たとえば、
[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回減算]+[1]
2行目からこの法則です.2行目には中間部分がないので、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