
方法1、递归函数
基于杨辉三角的数学定义直接实现
c
P(i, j) = {
1, ( if j == 0 or j == i)
P(i-1, j-1) + P(i-1, j), ( otherwise )
}
算法步骤
-
基础情况:当位置是行的开头或结尾时(j=0 或 j=i),返回 1
-
递归情况:其他位置的值等于左上角元素 + 正上方元素
-
遍历输出:对每个位置调用递归函数计算值
#include <stdio.h>
// 递归计算杨辉三角的值
int pascalRecursive(int row, int col) {
// 边界条件
if (col == 0 || col == row) {
return 1;
}
// 递归关系:P(row, col) = P(row-1, col-1) + P(row-1, col)
return pascalRecursive(row - 1, col - 1) + pascalRecursive(row - 1, col);
}
// 使用递归方法输出杨辉三角
void printPascalRecursive(int n) {
printf("使用递归方法输出杨辉三角(%d行):\n", n);
for (int i = 0; i < n; i++) {
// 打印前导空格,形成三角形
for (int j = 0; j < n - i - 1; j++) {
printf(" ");
}
// 打印当前行的所有元素
for (int j = 0; j <= i; j++) {
printf("%4d", pascalRecursive(i, j));
}
printf("\n");
}
}
int main() {
int n;
printf("请输入要输出的杨辉三角的行数: ");
scanf("%d", &n);
if (n <= 0) {
printf("行数必须大于0!\n");
return 1;
}
printPascalRecursive(n);
return 0;
}
方法2、使用一维数组
利用杨辉三角的递推性质,原地更新数组
算法步骤
-
初始化数组:创建一个足够大的一维数组
-
逐行构建:
-
从右向左更新数组,避免覆盖前值
-
每行的最后一个元素总是 1
-
中间元素:
row[j] = row[j] + row[j-1] -
每行的第一个元素总是 1
-
-
输出当前行:打印数组中当前有效的部分
#include <stdio.h>
// 优化版本:使用一维数组(节省空间)
void printPascalArrayOptimized(int n) {
printf("print yanghui<%drow>:\n", n);
int row[n]; // 只需要存储当前行的数据
for (int i = 0; i < n; i++) {
// 从右往左更新数组,避免覆盖前一个值
row[i] = 1; // 每行的最后一个元素总是1
for (int j = i - 1; j > 0; j--) {
row[j] = row[j] + row[j-1];
}
row[0] = 1; // 每行的第一个元素总是1
// 打印前导空格
for (int j = 0; j < n - i - 1; j++) {
printf(" ");
}
// 打印当前行
for (int j = 0; j <= i; j++) {
printf("%4d", row[j]);
}
printf("\n");
}
}
int main() {
int n;
printf("row: ");
scanf("%d", &n);
if (n <= 0) {
printf("row>0!\n");
return 1;
}
printf("\n");
printPascalArrayOptimized(n);
return 0;
}
方法3、使用二维数组
算法步骤
-
创建二维数组:
pascal[n][n] -
逐行填充:
-
边界元素:
pascal[i][0] = pascal[i][i] = 1 -
内部元素:
pascal[i][j] = pascal[i-1][j-1] + pascal[i-1][j]
-
-
格式化输出:添加前导空格实现三角形显示
#include <stdio.h>
void printPascalArray(int n) {
printf("printf yanghui %d rows:\n", n);
// 创建二维数组存储杨辉三角
int pascal[n][n];
// 初始化数组
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) {
pascal[i][j] = 1; // 边界元素为1
} else {
// 内部元素等于上方两个元素之和
pascal[i][j] = pascal[i-1][j-1] + pascal[i-1][j];
}
}
}
// 打印杨辉三角
for (int i = 0; i < n; i++) {
// 打印前导空格,形成三角形
for (int j = 0; j < n - i - 1; j++) {
printf(" ");
}
// 打印当前行的所有元素
for (int j = 0; j <= i; j++) {
printf("%4d", pascal[i][j]);
}
printf("\n");
}
}
int main() {
int n;
printf("row: ");
scanf("%d", &n);
if (n <= 0) {
printf("row>0!\n");
return 1;
}
printf("\n");
printPascalArray(n);
return 0;
}

4559

被折叠的 条评论
为什么被折叠?



