- 翻了一圈发现没有C语言递归的解法,又无奈看不懂C++,于是花了一个多小时研究透了。
- 由于刚上大一,水平有限,可能有些理解不对,我尽量解释。
- 思路:
- 由杨辉三角性质得 坐标为[y][x]的数值=坐标[y-1][x]+坐标[y-1][x-1](递归公式),可想到用xy坐标代表所输出点的大小
- 构造主函数副函数 值得一提的是当 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;
}
- 然而发现直接用这个会超时,即已经得出来的[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;
}