小练习-杨辉三角Python实现

2020-03-05  本文已影响0人  旭Louis

杨辉三角

杨辉三角,是二项式系数在三角形中的一种几何排列。

(1)每个数等于它上方两数之和。
(2)每行数字左右对称,由1开始逐渐变大。
(3)最外层的数字总是1
(4)第二层是自然数,
(5)下一层数字之和是上一层的2倍
(6)(a+b)^n的展开式中的各项系数依次对应杨辉三角的第(n+1)行中的每一项,这正是定义中二项式系数。如最熟悉的 二项式分解,(a+b)2=a2+2ab+b^2,它的系数对应就是杨辉三角的第二层【1,2,1】。

利用第一个和第二个特性,我们就很方便地推导出杨辉三角每一行的数值。只要给出初始值,第一行只有一个【1】,每一行总是【1】开始,然后根据每个数等于它上方两数之和,便能求解出任何位置的数值,代码如下。

def pascal(depth):
    """杨辉三角"""
    res = [[1]] # 第一层
    for i in range(0, depth):
        layer = [1] # 特性3:每一层都是1开始
        for j in range(0, len(res[i]) - 1):
            # 特性1:每个数等于它上方两数之和
            layer.append(res[i][j] + res[i][j + 1]) 
        layer.append(1) # 特性3:每一层都是1结尾
        res.append(layer) # 把每一层的数列加到结果中
    return res

def print_pascal(data):
    """输出杨辉三角"""
    for squence in data:
        total = 0 #一层数值求和结果
        for i in squence:
            total += i
            print(i, end=' ')
        print("=%d" % total, end=' ') # end表示输出结尾
        print()# 默认的输出结尾是\n,回车另起一行。

用pascal()函数返回的结果作为输入,我们再看看print_pascal()函数处理后的样子。

print_pascal(pascal(9))
# -----------结果-------------
1 =1 
1 1 =2 
1 2 1 =4 
1 3 3 1 =8 
1 4 6 4 1 =16 
1 5 10 10 5 1 =32 
1 6 15 20 15 6 1 =64 
1 7 21 35 35 21 7 1 =128 
1 8 28 56 70 56 28 8 1 =256 
1 9 36 84 126 126 84 36 9 1 =512 

这样显示就一目了然,顺带验证了了它的第五个特性,真的是一个很神奇的规律,其实它还有更多有趣的规律,比如我们按照一个斜度去求和数列,而不是按一层,你会发现,竟然会出现斐波那契数列的项


image.png

杨辉三角和斐波拉契数列的关系如下:
F(0) = C(0,0)=1
F(1) = C(1,0)=1
F(2) = C(2,0) + C(1,1)=1+1=2
F(3) = C(3,0) + C(2,1)=1+2=3
F(4) = C(4,0) + C(3,1) + C(2,2)=1+3+1=5
由此推到出F(n)=C(n-m, m)(m<=n-m)

def pascal_to_fibonacci(data):
    result = []
    for n in range(len(data)):
        fib = [] # 初始化每一层的数列,为空
        m = 0
        while n - m >= m:
            # 根据定义,杨辉三角和斐波拉契数列的转化下标关系
            fib.append(data[n-m][m])
            m += 1
        result.append(fib)
    print_pascal(result) # 借用杨辉三角输出函数输出每一层的和

测试一下当n=6的时候,结果如何。

pascal_to_fibonacci(pascal(6))
# -----------结果-------------
1 =1 
1 =1 
1 1 =2 
1 2 =3 
1 3 1 =5 
1 4 3 =8 
1 5 6 1 =13 
上一篇 下一篇

猜你喜欢

热点阅读