递推之杨辉三角

  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;
}

你可能感兴趣的:(算法,数学)