[算法设计与分析]3.4.1杨辉三角形的应用(递归+递推)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Pecony/article/details/79683693

求n阶二项式系数的数学模型就是求n阶杨辉三角形 

杨辉三角最本质的特征是,它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和。

不难看出:当n=1时两个系数有确定值,前两项分别为1,1。

#include<stdio.h>
#include<iostream>
#include<iomanip>

using namespace std;
const int N = 100;//设置用于递归的一维数组的长度
const int H = 8;//设置杨辉三角形的高

void Coeff1(int a[], int n);//递归进行杨辉三角形的求解和输出
void Coeff2(int n);

int main ()
{
    int a[N];
    int n = H;//n在递归中不断发生改变
    Coeff1(a, n - 1);//因为在递归结束的那一层处理了两行三角形 因此高度要-1才是目标高度
    Coeff2(n);
}

void Coeff1(int a[], int n)
{
    int i;
    if(n == 1)//此时对应于二项式的(a+b)^1 此时实际上处理了杨辉三角形的前两行
    {
        a[1] = 1;//杨辉三角形的前两项均为1
        a[2] = 1;
        for(int j = n; j <= H; j++)
                cout << " ";//输出空格 此时为1->H
        cout << a[1] << " " <<endl;
        for(int j = n; j < H; j++)
            cout << " ";//输出空格 此时为1->H
        for(i = 1; i <= n + 1; i++)
            cout << a[i] << " ";
        cout << endl;
    }
    else
    {
        Coeff1(a, n - 1);
        a[n + 1] = 1;//对应于右侧斜边 该位置的元素不等于肩上两个元素的和
        for(i = n; i >= 2; i--)
        {//因为每次只保留一层 因此下面一条语句对应的正是当前位置的元素=鉴赏两个元素的和
            a[i] += a[i - 1];//将三角形的最下面一条边存储在一个一维数组中,并没有对之前数据的保留,因此要直接输出
           // a[1]= 1;
        }
        for(int j = n; j < H; j++)
                cout << " ";//第一次执行的时候n=2 此时执行2->(H-1)
        for(i = 1; i <= n + 1; i++)
            cout << a[i] << " ";//由上方的语句可知 本层的一维数组中存储的是n+1个数据 且下标从1开始
        cout << endl;
    }
}
/*
1

1 1

1 2 1

1 3 3 1

1 4 6 4 1
若使用二维数组 则对应的存储就是上面这个三角形 可以看到每一列的第一个元素都是1 最后一个元素也是1
*/
void Coeff2(int n)
{
    int a[n][n];
    for(int i = 0; i <= n; i++)
    {
        a[i][0] = 1;//每行第一个元素为0
        for(int j = 1; j < i; j++)
        {
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
        }
        a[i][i] = 1;//右侧斜边的值为1 也可以不单独进行处理 此时只需要把原数组全部元素进行初始化为0 就可以用统一的条件
    }

    for(int i = 0; i < n; i++)
    {
        for(int j = n - i; j > 0; j--)
            cout << " ";
        for(int k = 0; k <= i; k++)
            cout << a[i][k] << " ";
        cout <<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/Pecony/article/details/79683693