使用递归,一维数组,二维数组,分别实现杨辉三角函数

方法1、递归函数

基于杨辉三角的数学定义直接实现

c

P(i, j) = {
    1,                                  ( if j == 0 or j == i)
    P(i-1, j-1) + P(i-1, j),            ( otherwise          )
}

算法步骤

  1. 基础情况:当位置是行的开头或结尾时(j=0 或 j=i),返回 1

  2. 递归情况:其他位置的值等于左上角元素 + 正上方元素

  3. 遍历输出:对每个位置调用递归函数计算值

#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. 初始化数组:创建一个足够大的一维数组

  2. 逐行构建

    • 从右向左更新数组,避免覆盖前值

    • 每行的最后一个元素总是 1

    • 中间元素:row[j] = row[j] + row[j-1]

    • 每行的第一个元素总是 1

  3. 输出当前行:打印数组中当前有效的部分

#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、使用二维数组

算法步骤

  1. 创建二维数组pascal[n][n]

  2. 逐行填充

    • 边界元素:pascal[i][0] = pascal[i][i] = 1

    • 内部元素:pascal[i][j] = pascal[i-1][j-1] + pascal[i-1][j]

  3. 格式化输出:添加前导空格实现三角形显示

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值