• 翻了一圈发现没有C语言递归的解法,又无奈看不懂C++,于是花了一个多小时研究透了。
  • 由于刚上大一,水平有限,可能有些理解不对,我尽量解释。
  • 思路:
  1. 由杨辉三角性质得 坐标为[y][x]的数值=坐标[y-1][x]+坐标[y-1][x-1](递归公式),可想到用xy坐标代表所输出点的大小
  2. 构造主函数副函数 值得一提的是当 n==1||i==1||i==n 时,可以直接返回1。差不多副函数写完就这样
int yhsj ( int n,int i ) {
	int z;
	if ( n==1||i==1||i==n )
		z=1;
	else
		z = yhsj (n-1, i-1) + yhsj (n-1 ,i);
	return z;
} 
  1. 然而发现直接用这个会超时,即已经得出来的[y-1][x-1]和[y-1][x]会重复计算多次,那我们可以把出现过的数字存储到数组中,下次引用就可以直接提出来,简直不要太快!
  • 整个题解如下:
#include<stdio.h>
//全局变量 
int n,i;
int arr[35][35]={{1}};//这个是优化数组(不加会超时),代表杨辉三角各个坐标的值,进行初始化,看不懂没关系,先往下看
//递归杨辉三角副函数
int yhsj ( int n,int i ) {
	int z;
	if ( n==1||i==1||i==n )
		return 1;//直接返回,不然跑到下面会错误计算
		
	if ( arr[n][i]!=0 )//还记得上面的数组初始化吗?若!=0,即这个数我们没算过,跑去下面算一下
		z = arr[n][i];
	else{
		z = yhsj (n-1, i-1) + yhsj (n-1 ,i);//计算完就存进数组,方便下次计算
		arr[n][i] = z;
	}
	return z;
} 


//主函数,输入n,使用void函数 
int main()
{
	scanf("%d", &n);
	for (int k=1; k<=n; k++ ) 
	{
		for ( i=1; i<=k; i++)
    		printf ("%d ", yhsj (k, i));//printf杨辉三角每排每列的值
	printf("\n");
	}    
	return 0;
}
  • 一个晚自习写完这个题,感觉还是收获挺多的