C语言打印杨辉三角(递归)(数学逻辑)

首先来介绍一下什么是杨辉三角

杨辉三角(也称帕斯卡三角)相信很多人都不陌生,它是一个无限对称的数字金字塔,从顶部的单个1开始,下面一行中的每个数字都是上面两个数字的和。是二项式系数在三角形中的一种几何排列,在中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623—-1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。 (如图所示)

初步了解之后我们可以思考如何实现杨辉三角:

  1. 法一:根据观察第一列和对角线上的元素之外,其余元素的值均为前一行上的同列元素和前一列元素之和。(我们可以依靠递归相加就行实现)
  2. 法二:根据观察我们可以得知,杨辉三角每一行的数实际上是二项式定理(a+b)^n的展开式的系数,第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。

                                                     

 法一:运用递归相加

#include <stdio.h>

long getadd(int a,int b){
    return (b == 1||b == a) ? 1 : getadd(a - 1,b - 1) + getadd(a - 1,b);
}

int main(){
    int i,j,n = 0;
    printf("输入所需杨辉三角的行数(1-20):");
    scanf("%d",&n);
    for(i = 1;i <=n; i++){
        for(j = 1;j <= i;j++){
            printf("%6ld",getadd(i,j));
        }
        printf("\n");
    }
    return 0;
}

 

法二:运用递归相乘求阶乘

#include <stdio.h>

int mat(int a){
    return (a == 1 || a == 0) ? 1 : a*mat(a - 1);
}

int main(){
    int i,j,n = 0;
    int temp = 0;
    printf("输入所需杨辉三角的行数(1-20):");
    scanf("%d",&n);
    for(i = 0;i < n; i++){
        for(j = 0;j <= i; j++){
            temp = mat(i) / (mat(i - j)*mat(j));
            printf("%5d",temp);
        }
        printf("\n");
    }

    return 0;
}

​​​​​​​ 

以上就是杨辉三角的实现思路,使用递归是占用内存最少且程序最简便的算法。

猜你喜欢

转载自blog.csdn.net/m0_60338933/article/details/123198555