杨辉三角组合数公式
杨辉三角是一种有趣的图形,其中每个数字等于上方两个数字之和。第 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
关键字释放内存,避免内存泄漏。