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
    评论
杨辉三角,也称为帕斯卡三角,是一个自古以来就有的数学概念,在C语言中,你可以用循环或递归的方式来构建它。这种三角形的特点是每个数字都是它上面两个数字的和,从左上角开始,每一行的最后一个数字和倒数第二个数字都是1。 下面是使用C语言打印杨辉三角的一个简单方法: ```c #include <stdio.h> void printPascalTriangle(int n) { for (int line = 0; line < n; line++) { // 前导空格 for (int spaces = n - 1 - line; spaces > 0; spaces--) { printf(" "); } // 打印当前行的数字 for (int col = 0; col <= line; col++) { if (col == 0 || col == line) { printf("%d", 1); // 首尾数字为1 } else { printf("%d", pascal_triangle[line][col]); // 使用前一行的数字计算当前位置的值 } // 如果不是最后一列,加一个分隔符 if (col != line) { printf(" "); } } printf("\n"); // 换行 } } // 初始化杨辉三角的前一行 int pascal_triangle = {1}; // 计算并填充更大的三角形 for (int i = 1; i < n; i++) { int *new_row = (int *)malloc(sizeof(int) * (i + 1)); new_row = new_row[i] = 1; for (int j = 1; j < i; j++) { new_row[j] = pascal_triangle[i - 1][j - 1] + pascal_triangle[i - 1][j]; } // 将新行存储到数组中 for (int j = 0; j < i; j++) { pascal_triangle[i][j] = new_row[j]; } free(new_row); // 释放旧行空间 } int main() { int rows; printf("Enter the number of rows for the Pascal's triangle: "); scanf("%d", &rows); printPascalTriangle(rows); return 0; } ``` 运行这个程序时,会提示用户输入行数,然后它将打印出指定行数的杨辉三角
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值