Python-杨辉三角

"""
          1
         / \
        1   1
       / \ / \
      1   2   1
     / \ / \ / \
    1   3   3   1
   / \ / \ / \ / \
  1   4   6   4   1
 / \ / \ / \ / \ / \
1   5   10  10  5   1
杨辉三角(贾宪三角、帕斯卡三角):
    1.杨辉三角,是二项式系数在三角形中的一种几何排列,把组合数内在的一些代数性质直观地从图形中体现出来,是一种
    离散型的数与形的结合
    2.概述:
        (1)每行端点与结尾的数为1
        (2)每个数等于它上方两数之和
        (3)每行数字左右对称,由1开始逐渐变大
        (4)第n行的数字有n项
        (5)第n行的m个数可以表示为C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数
        (6)第n行的第m个数和第n-m+1个数相等,为组合数性质之一
        (7)每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行第i-1个数与第i个数之和,这也是
        组合数的性质之一。即C(n+1,i) = C(n,i-1) + C(n,i)
        (8)(a+b)的n次方的展开式中的各项系数以此对应杨辉三角的第(n+1)行中的每一项
        (9)将第2n+1行第1个数,第2n+2行第3个数,第2n+3行第五个数......连成一线,这些数的和是第4n+1个斐波拉契数;
            将第2n行第2个数(n>1),第2n-1行第4个数,第2n-2行第6个数......这些数的和是第4n-2个斐波拉契数
        (10)将第n行的各项数值,分别乘以10的列数m-1次方,然后把这些数值相加的和等于11的n-1次方。
编码思路:
    1.通过参数明确每行前面的空格数
    2.每行元素个数等于行数,其中首尾都是1
    3.第n行从第2个数开始到n-1个数,都是第n-1行对应前两个数之和(n>2)
    通过递归求值
"""

def yanghui_triangle(n):
    for i in range(1, n+1):  #1 - n 外层循环行数
        for sp in range(n-i):   #每行前面的空格数
            print(end = "\t")
        for j in range(1, i+1):  #1 - i 内层循环每行个数
            if j == 1 or j == i:    #首尾都是1
                print(1, end = "\t\t")
            else:   #计算非首尾位置的数
                print(get_value(i, j), end = "\t\t")
        print()
def get_value(x, y):
    if y == 1 or x == y:    #首尾为1
        return 1
    else:
        return get_value(x-1, y-1) + get_value(x-1, y)  #递归来求对应位置的数

yanghui_triangle(7)

运行结果:
在这里插入图片描述
使用生成器实现:

def yanghui_triangle(n):
    for i in range(1, n+1):  #1 - n 外层循环行数
        for sp in range(n-i):   #每行前面的空格数,并放入生成器中
            yield "\t"
        for j in range(1, i+1):  #1 - i 内层循环每行个数
            if j == 1 or j == i:    #首尾都是1,将数字和空格放入生成器
                yield "1\t\t"
            else:   #计算非首尾位置的数,将数字和空格都放入生成器
               yield str(get_value(i, j)) + "\t\t"
        yield "\n"
def get_value(x, y):
    if y == 1 or x == y:    #首尾都是1
        return 1
    else:
        return get_value(x-1, y-1) + get_value(x-1, y)  #递归来求对应位置的数

for i in yanghui_triangle(7):   #迭代生成器
    print(i, end = "")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值