C语言(04)——杨辉三角的代码实现

为了更好地理解本篇文章的知识内容,读者可以将以下文章作为补充知识进行阅读 :

C语言————斐波那契数列的理解和运用-优快云博客

(强烈建议阅读,杨辉三角与斐波那契相关性强)

C语言————原码 补码 反码 (超绝详细解释)-优快云博客

C语言——详解语句(适合零基础)-优快云博客

C语言——关于指针(逐渐清晰版)-优快云博客

在了解杨辉三角前,我们先了解一下二项式系数的基础知识(以下为百度百科中的内容):

什么是杨辉三角?

杨辉三角最早由北宋数学家贾宪提出,南宋数学家杨辉在《详解九章算法》中对其进行了详细记载,因此得名(在国外也被称为 “帕斯卡三角”,因法国数学家帕斯卡后来也独立发现了它)。

他的每一行都是对应次幂二项式展开式每一项的系数,涉及到相关阶乘数据的计算。

每一行中间的数字等于他上方两个数字之和,即:C(n,k)=C(n−1,k−1)+C(n−1,k)

那么我们怎么在C语言中将其打印出来呢?

我们常见的两个方法有:暴力拆解法、递归法。

暴力拆解法

对于每一行的数字,他们值的计算有如下的规律,n代表所在行数,k代表列数,n和k同时可以确认杨辉三角中一个具体位置的数值大小。

因此我们可以先分解这个计算式,创建如下两个函数;

阶乘函数:

每一个非负整数的阶乘都等于前一个数字的阶乘乘以他自身

int multiply(int x)//求一个数的阶乘
{
	if (x == 0)
		return 1;
	else
		return (x * multiply(x - 1));//递归思想
}

 组合数函数:

int result_1(int x, int y)
{
	int a = multiply(y) / multiply(y - x);//两个函数的嵌套使用
	return a / multiply(x);
}

需注意这两个代码的先后顺序,避免出现报错情况 。

有了这两个函数作为工具,我们可以试着对杨辉三角进行拆解,他的几个重要特性:

1.  行数编号由n = 0起始,每一行的元素个数为n + 1个;

2.  行数为n列数为k的数值可以用result_1(k,n)来求解;

3.  通过输入的行数来限制杨辉三角行数的打印。

具体的实现方式如下:

//主运行程序块
int main()
{
	int n = 0;//确认行数
	int k;//限制打印的行数
	scanf("%d", &k);
	while (n <= k)
	{
		int count = 0;//计算每行的元素个数
		for (int i = 0; i <= n; i++)
		{
			printf("%d ",result_1(i, n));
			count++;
			if (count >= n + 1)
				break;
		}
		printf("\n");
		n++;
	}
	return 0;
}

递归法

杨辉三角使用递归的方法其实也能在上述代码中看到影子(如阶乘函数),我们知道杨辉三角中每一行中间的数字等于他上方两个数字之和,根据这个特性,我们得到了新的函数:

int result_2(int x, int y)//递归的方法
{
	if (x == 0 | x == y)//在两边的值为0
		return 1;
	else
	return result_2(x,y - 1) +  result_2(x - 1, y - 1);
}

我们将暴力拆解程序块中的 result_1 替换成 result_2 函数,即可完成杨辉三角的打印,具体程序如下:

int main()
{
	int n = 0;//确认行数
	int k;//限制打印的行数
	scanf("%d", &k);
	while (n < k)
	{
		int count = 0;//计算每行的元素个数
		int j = 0;//判断打印的第几行
		//for(int z = 1;z <= (k - n - 1)  ;z ++)//为了打印空格
		//{
		//	printf("  ");
		//}
		for (int i = 0; i <= n; i++)
		{
			printf("%d  ", result_2(i, n));
			count++;
			if (count >= n + 1)
				break;
		}
		printf("\n");
		n++;
	}
	return 0;
}

不管是暴力拆解法还是递归法,他们的运行结果都是一致的,但递归法会一次次调用函数,这给内存施加压力,因此在打印行数偏大时,优选暴力拆解法,他们运行的结果如下图(以行数5为例子): 

我们可以思考一下 ,那应该如何给他打印成三角形的分布形状呢?

每一行最右边一侧的数字前留的空间会随着行数的上升逐步减少,根据这个特性,我们给他加入了随行数减少的空格打印,具体结果如下:

 仅供参考,也希望大佬们能够不吝赐教,加深我对杨辉三角的理解。

打怪升级中.........................................................................................................................................


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ankleless

打赏就位,创作火力全开~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值