C语言杨辉三角-(递推-迭代)

杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家
杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡
(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡
三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。
                                 ------以上内容来自百度

杨辉三角性质,除每行第一位和最后一位数字之外,其他某行某列的数字均为其前一行对应的数字及其对应数字前一位的加和。

由杨辉三角可以看见,每一行的第一列和最后一列数字均为1,则可通过代码第八行至十二行(后文递推代码),使用for循环对a[i][i]以及a[i][1]进行赋值,实现了每行的第一位和最后一位数字均为1。
除每行第一位和最后一位数字之外,其他某行某列的数字均为其前一行对应的数字及其对应数字前一位的加和,即a[i][j]=a[i-1][j-1]+a[i-1][j],在代码实现中,通过双层for循环来控制i,j的变化来表示行列的变化,另需注意循环条件从第三行开始,每行从第二列进行杨辉三角其他数值的赋值,并且始终j<i。

最后通过双层for循环,进行杨辉三角的输出操作。第一个for循环用来控制行数变化,而第二个for循环用来控制每一行中每一列的输出,当每一行输出完毕后,进行换行并继续下一行的输出,如此重复。
程序采用递推方式运行,代码如下:

#include<stdio.h>
int main()
{
	int n,i,j;
	printf("请输入需要打印的行数:");
	scanf("%d",&n);
	int a[n+1][n+1];
	for(i=1;i<=n;i++)
	{
		a[i][1]=1;
		a[i][i]=1;
	}
	for(i=3;i<=n;i++)
		for(j=2;j<i;j++)
		{
			a[i][j]=a[i-1][j-1]+a[i-1][j];
		}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=i;j++)
			printf("%d\t",a[i][j]);
		printf("\n");
	}
	return 0;
 } 
另采用迭代法进行代码实现

杨辉三角第一行为单独的一个数字1,先进行单独输出,并且进行换行。

for循环控制进行除第一行之外的n-1行,因此控制循环条件为i<=n-1。由于杨辉三角每行第一列均为1,因此先进行m的初始化赋值,且先输出,之后再进行同行其余列的输出。由于第n行的m个数均可表示为C(n-1,m-1),即从n-1个不同元素中取m-1个元素的组合数,组合公式有C(n,0)=1;C(n,k)=(n-k+1)/k x C(n,k-1)。通过组合公式,可得到同行其余列的数值,将其通过for循环输出。依次循环通过i的变换输出每行,j的变换输出每行的每一个数,最终得到所需行数的杨辉三角。
程序采用迭代法,代码如下

#include<stdio.h>
int main()
{
	int i,j,m,n;
	printf("请输入需要打印的行数:");
	scanf("%d",&n);
	printf("1\n");
	for(i=1;i<=n-1;i++)
	{
		m=1;
		printf("%d\t",m);
		for(j=1;j<=i;j++)
		{
			m=m*(i-j+1)/j;
			printf("%d\t",m);
		}
		printf("\n");
	}
	return 0;
 } 

总结:递推方式并不是一成不变的,旺旺有多重方式可供选择。
以上代码时间复杂度均为O(n2)

我是【楚辞】,让我们一起学习。

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值