C | Python 杨辉三角形

杨辉三角形也叫贾宪三角形,西方叫帕斯卡三角形,其实就是各阶二项式系数排列起来构成的三角形,如下。每行的数字实际上是(a + b) ^ n展开后的结果。

          1 
         1 1 
        1 2 1 
       1 3 3 1 
      1 4 6 4 1

历史上发现这个三角形的人很多,这里介绍几个主要的,北宋人贾宪约1050年首先使用“贾宪三角”进行高次开方运算。杨辉,字谦光,南宋时期杭州人。在他1261年所著的《详解九章算法》一书中,辑录了如上所示的三角形数表,称之为“开方作法本源”图。欧洲直到1623年以后,法国数学家帕斯卡在13岁时发现了“帕斯卡三角”。

其实质是二项式(a+b)的n次方展开后各项的系数排成的三角形,它的特点是左右两边全是1,从第二行起,中间的每一个数是上一行里相邻两个数之和。这个题目常用于程序设计的练习。

#include <stdio.h>
#define N 10

int main(int argc, char const *argv[])
{
	int a[N][N],i,j;

	for (i = 0; i < N; i++)
	{
		a[i][i] = 1;
		a[i][0] = 1;
	}

	for (i = 2; i < N; i++){
		for (j = 1; j <= i - 1; j++)
			a[i][j] = a[i-1][j] + a[i-1][j-1];
	}

	for (i = 0; i < N; i++){
		for (j = 0; j <= i; j++)
			printf("%5d\n", a[i][j]);
			printf("\n");
	}
	
	printf("\n");
	return 0;
}

PY:

一.

#将杨辉三角的每一行看成一个list,写一个生成器(generator),不断输出下一行list

def triangel(n):
    L=[1]                                                                 #定义一个list[1]
    while True:
        yield L                                                           #打印出该list
        L=[L[x]+L[x+1] for x in range(len(L)-1)]        #计算下一行中间的值(除去两边的1)
        L.insert(0,1)                                                 #在开头插入1
        L.append(1)                                                 #在结尾添加1
        if len(L)>10:                                                 #仅输出10行

            break


#生成一个generator对象,然后通过for循环迭代输出每一行
a=angel(10)
for i in a:

    print(i)

注:普通函数和generator生成器的区别:

1.普通函数调用直接返回结果,generator函数的调用,返回一个generator对象;(调用generator时可以先创建一个对象,再用next()方法不断获得下一个返回值,但实际中通常用for循环实现)

2.generator在执行过程中,遇到yield就中断,下次又继续执行

二.

def triangel():
    L=[1]                                                                 #定义一个list[1]
    while True:
        yield L                                                           #打印出该list
        L=[1]+[L[x]+L[x+1] for x in range(len(L)-1)]+[1]
        #计算下一行中间的值(除去两边的1)
n = 0
for t in triangel():
    print(t)
    n = n + 1
    if n == 10:
        break

#解析

#函数triangle()生成的实际上是一个每个元素都为list的list  即list的嵌套

#由yield L可知,此生成器每次生成的是L 

#triangle的第0个元素是初始化的L=[1]

#计算triangle的第1个元素时,即第一次执行L = [1]+[L[i] + L[i+1] for i in range(len(L)-1)]+[1],第一个和最后一个默认为[1],中间是一个列表生成式

#首先看列表生成式中的for循环,此时len(L)=1(因为此时L=[1],只有一个元素),所以range(len(L)-1)]=range(0),即空list,所以没有i

#所以中间的列表生成式为空  triangle的第1个元素为L=[1,1]

#计算triangle的第2个元素时,即第二次执行L = [1]+[L[i] + L[i+1] for i in range(len(L)-1)]+[1],第一个和最后一个默认为[1],中间是一个列表生成式

#列表生成式中的for循环,此时len(L)=2(因为此时L=[1,1],2个元素),所以range(len(L)-1)]=range(1)=[0]

#i=0时,列表生成式生成L[0] + L[0+1]=1+1=2  

#所以L=[1,2,1]

#……以此类推,计算triangle的第3个元素时,range(len(L)-1)]=range(2)=[0,1]

#i=0时,列表生成式生成L[0] + L[0+1]=1+2=3 ;i=1时,列表生成式生成L[1] + L[1+1]=2+1=3 

#所以L=[1,3,3,1]

#…………………………

    原文作者:杨辉三角问题
    原文地址: https://blog.csdn.net/qq_31736553/article/details/79254891
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞