递推之杨辉三角

本文介绍了杨辉三角的历史背景及其在二项展开式中的应用。杨辉三角的构造规律包括每一行首尾为1,中间数值由上一行相邻两数相加得出。文章还提出了一种算法,通过递推关系生成并打印杨辉三角的前n行,利用二维数组实现,并通过双重循环控制输出的对称性。
  1. 问题描述
    杨辉三角,历史悠久,是我国古代数学家杨辉揭示二项展开式各项系数的数字三角形。
    我国北宋数学家贾宪约1050年首先使用“贾宪三角”进行高次开方运算,南宋数学家杨辉在《详解九章算法》记载并保存了“贾宪三角”,故称杨辉三角。元朝数学家朱世杰在《四元玉鉴》扩充了“贾宪三角”成“古法七乘方图”。在欧洲直到1623年以后,法国数学家帕斯卡才发现了“帕斯卡三角”。
    杨辉三角构建规律主要包括横行各数之间的大小关系以及不同横行数字之间的联系,奥妙无穷:每一行的首尾两数均为1;第k行共k个数,除首尾两数外,其余各数均为上一行的肩上两数的和。如图3-1为5行杨辉三角。
    这里写图片描述
    设计程序,打印杨辉三角形的前n行(n从键盘输入)。
  2. 算法分析
    考察杨辉三角形的构成规律,三角形的第i行有i个数,其中第1个数与第i个数都是1,其余各项为它的两肩上数之和(即上一行中相应项及其前一项之和)。
    设置二维数组a(n,n),根据构成规律实施递推:
    递推关系: a(i,j)=a(i-1,j-1)+a(i-1,j) (i=3,…,n;j=2,…,i-1)
    初始值: a(i,1)=a(i,i)=1 (i=1,2,…,n)
    为了打印输出左右对称的等腰数字三角形, 设置二重循环: 设置i控制打印n行,每一行开始换行,打印40-3i个前导空格;设置j循环控制打印第i行的各数组元素a(i,j)。
  3. 程序代码
#include <iostream>
#include <cstring>

using namespace std;


int main()
{
    int n;
    cin >> n;

    //动态库开辟一个二维数组,会造成浪费n个int*的空间 
    int** arr = new int*[n];
    for (int i=0; i<n; ++i)
    {
        arr[i] = new int[n]; 
    }

    //init
    for (int i=0; i<n; ++i)
    {
        memset(arr[i], 0, sizeof(int)*n); 
        arr[i][0] = 1;
        arr[i][i] = 1; 
    }

    //calc
    for (int i=2; i<n; ++i)
    {
        for (int j=1; j<n-1; ++j)
        {
            arr[i][j] = arr[i-1][j-1] + arr[i-1][j]; 
        }
    }


    //traverse
    for (int i=0; i<n; ++i)
    {
        //打印空格
        for (int k=0; k<40-3*i; ++k)
            cout << ' '; 
        for (int j=0; j<=i; ++j)
        {
            printf("%6d", arr[i][j]); 
        }
        cout << endl;
    }

    //free
    for (int i=0; i<n; ++i)
    {
        delete[] arr[i]; 
    }
    delete[] arr; 

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值