当前位置:首页C++程序设计 > 正文

杨辉三角组合数公式

作者:野牛程序员:2023-05-07 14:06:55C++程序设计阅读 2529

杨辉三角是一种有趣的图形,其中每个数字等于上方两个数字之和。第 n 行表示为 (n+1) 个数字,可以用组合数表达式 C(n,k) 表示。

具体地说,对于第 n 行的第 k 个数字,它可以表示为 C(n,k-1),其中 C(n,k) 是组合数,表示从 n 个不同的物体中选择 k 个物体的方案数。

因此,杨辉三角的第 n 行可以表示为:

C(n,0), C(n,1), C(n,2), ..., C(n,n-1), C(n,n)

例如,杨辉三角的前几行如下:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

第一行只有一个数字 1。 第二行有两个数字 1,它们分别是第一行的两个数字之和。 第三行的第二个数字是第二行的前两个数字之和,第三个数字是第二行的后两个数字之和。 以此类推,每一行的数字都是上方两个数字之和,最后一行有 n+1 个数字,表示 (n+1) 种组合。


以下是加上注释的生成杨辉三角的前 numRows 行的伪代码:

// 生成杨辉三角的函数
function generate(numRows: integer): array of array of integer
    // 初始化一个 numRows 行的二维数组
    res := new array of array of integer with numRows rows
    // 对每一行进行遍历
    for i := 0 to numRows-1 do
        // 对于第 i 行,动态分配一个 i+1 大小的一维数组
        res[i] := new array of integer with i+1 elements
        // 将第 i 行的首尾元素赋值为 1
        res[i][0] := 1
        res[i][i] := 1
        // 对于第 i 行的中间元素,从第二个开始遍历到倒数第二个
        for j := 1 to i-1 do
            // 计算当前位置的元素值,等于上一行的左上和右上元素之和
            res[i][j] := res[i-1][j-1] + res[i-1][j]
        end for
    end for
    // 返回杨辉三角的结果
    return res
end function

注释说明了每一行代码的作用和功能,方便理解和阅读代码。需要注意的是,该伪代码使用了动态数组,需要手动管理内存,在程序结束时使用 delete 关键字释放内存,避免内存泄漏。

生成杨辉三角的前 numRows 行的自然语言表述如下:

从第一行开始,每行数字左右对称,每个数字是它上方两个数字之和。例如,第一行只有一个数字 1;第二行数字为 1, 1+1=2;第三行数字为 1, 1+2=3, 2+1=3;第四行数字为 1, 1+3=4, 3+3=6, 3+1=4;以此类推,生成 numRows 行数字,即为杨辉三角。

题目:给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

例如,numRows = 5 时,应该返回如下杨辉三角:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

C++代码实现1:

#include <iostream>
#include <vector>

using namespace std;

vector<vector<int>> generate(int numRows) {
    vector<vector<int>> res(numRows);
    for (int i = 0; i < numRows; i++) {
        res[i].resize(i+1);
        res[i][0] = res[i][i] = 1;
        for (int j = 1; j < i; j++) {
            res[i][j] = res[i-1][j-1] + res[i-1][j];
        }
    }
    return res;
}

int main() {
    int numRows = 5;
    vector<vector<int>> res = generate(numRows);
    for (int i = 0; i < numRows; i++) {
        for (int j = 0; j < i+1; j++) {
            cout << res[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

这段代码使用了一个二维 vector 存储杨辉三角的结果,然后依次计算每一行的数字。对于每一行,先将 vector 的大小调整为当前行数加一,然后将首尾数字赋值为 1,最后依次计算每个位置的数字。最后输出杨辉三角的结果即可。

如果不使用 <vector> 库,可以使用动态数组来实现:

#include <iostream>

using namespace std;

int main() {
    int numRows = 5;
    int** res = new int*[numRows];
    for (int i = 0; i < numRows; i++) {
        res[i] = new int[i+1];
        res[i][0] = res[i][i] = 1;
        for (int j = 1; j < i; j++) {
            res[i][j] = res[i-1][j-1] + res[i-1][j];
        }
    }
    for (int i = 0; i < numRows; i++) {
        for (int j = 0; j < i+1; j++) {
            cout << res[i][j] << " ";
        }
        cout << endl;
        delete[] res[i];
    }
    delete[] res;
    return 0;
}

这段代码同样使用了动态数组存储杨辉三角的结果,然后依次计算每一行的数字。对于每一行,先使用 new 关键字动态分配内存,然后将首尾数字赋值为 1,最后依次计算每个位置的数字。最后输出杨辉三角的结果,并使用 delete 关键字释放内存即可。

需要注意的是,由于使用了动态数组,需要手动管理内存,即在程序结束时使用 delete 关键字释放内存,避免内存泄漏。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击