|
发表于 2022-12-4 20:47:38
From FishC Mobile
|
显示全部楼层
|阅读模式
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
int i,j,a[8]={1};
printf("%3d\n",a[0]);
for(i=1;i<8;i++)
{
a[i]=1;
for(j=i-1;j>0;j--)
a[j]=a[j]+a[j-1];
for(j=0;j<=i;j++)
printf("%3d",a[j]);
printf("\n");
}
请问,这个程序是怎么运行的看不明白
本帖最后由 zhangjinxuan 于 2022-12-5 08:18 编辑
这个是在打印杨辉三角,如果我们把整个杨辉三角看作一个二维数组 a,那么:
- a[i][j] = a[i - 1][j] + a[i - 1][j - 1]
复制代码
也就是说,这个数字由上一行相邻的两个数字组成
既然知道了递推公式,写出代码也就是很简单的了:
- #include <cstdio>
- int main() {
- int i,j,a[8]={1}; //初始化 a 数组,这里用到了一个小技巧,用一维,为什么这能正常运行之后再讲
- printf("%3d\n",a[0]); //打印首项
- for(i=1;i<8;i++)
- {
- a[i]=1; //杨辉三角每行的第一列总是1
- for(j=i-1;j>0;j--)
- a[j]=a[j]+a[j-1]; //实际上, a[j] 就是前一行计算的结果,因为这时a[j]还没有计算,a[j]也就只能保留上一行的结果了,还因为 j 是从大到小的,a[j-1]仍然是保留上一行的结果所以 a[j-1]也是上一行左边的数字,所以,在a[j]还没有计算之时, a[j] 和 a[j-1] 加起来就是 i 行 j 列的实际结果
- for(j=0;j<=i;j++)
- printf("%3d",a[j]); //打印
- printf("\n");
- }
- }
复制代码
如果你还是不理解为什么1维也是对的,那就纸上模拟一下,或者画一个图也可以
|
|