知交

杨辉三角(数组/递归)

最近也是刚刚学C语言不到两个月,对于杨辉三角这个经典的题目在此进行记录下,一方面有助于以后的复习,另一方面希望之后能够帮助到像我这样的初学者。

我这里以遇到的题目为例,来研究最简单的那个,也就是类似于这种:

1

1  1  

1   2   1

1   3    3   1

………………

这里先给出数组的方法。我所采用的是二维数组,这里先给出代码,具体的分析就请看注释吧。

#include <stdio.h>
int main()
{
    int a[100][100],n;//首先自定义一个二维数组和一个控制循环的变量n,也就是你所需打印的行数
    printf("输入所打印的行数\n");
    scanf("%d",&n);
    a[0][0]=1;//将数组的第一个元素赋值为1,这也就是三角的第一个元素
    int i,k;
    for(i=0;i<=n;i++)//第一个i控制的是行数,进行一次循环会输出一个"\n"
    {
        for(k=0;k<i;k++){//第二个k控制输出每行的元素
            if(k==0) a[i][k]=1;//每行的第一个元素为1
            if(k==i) a[i][k]=1;//行列相等时元素为1
            else a[i][k]=a[i-1][k]+a[i-1][k-1];//杨辉三角的递推公式
            printf("%5d",a[i][k]); 
        }
        printf("\n");
    }
    return 0;
    
 } 

接下来我们来看递(套)归(娃)的办法:

其实用递归我也是一时兴起,在学过递归之前我都没有在回头看过杨辉三角,以为这东西会一个代码就够了,后来见识到递归的简便性,发现自己实在是太无知了23333

这里先大概说下我对于递归的理解吧:递归也就是函数自己调用自己,借此,我们可以通过递归来表示一些循环部分。

这里依旧是先给出代码:

#include <stdio.h>
int yhsj(int a,int b)//首先定义一个函数,a表示行元素,b表示列元素,这里我没有用数组,所以他们都是从1开始的。 
{
    if(a==b) return 1;//这里设置三个递归出口,也就是当行列相等或者行列为1时的返回值。 
    if(b==1) return 1; 
    if(a==1) return 1;
    else   return yhsj(a-1,b)+yhsj(a-1,b-1);//好的,出现了!这里就是通过递归来实现杨辉三角的递推式。 
}

int main()//主函数与之前的数组类似,不过不同的是printf可以直接采用之前定义的函数 
{
    int i,n,k;
    printf("输入打印行数\n");
    scanf("%d",&n); 
    for(i=1;i<=n;i++)
    {
        for(k=1;k<=i;k++)
        {
            printf("%5d",yhsj(i,k));
        }
        printf("\n");     
    }
    return 0;
}

这里给大家看下输出的结果:

输入打印行数
6
    1
    1    1
    1    2    1
    1    3    3    1
    1    4    6    4    1
    1    5   10   10    5    1

--------------------------------
Process exited after 2.728 seconds with return value 0
请按任意键继续. . .

好的,这就是我对于杨辉三角的理解,个人感觉递归的方法其实更加好用,相比于常规的数组来说,看着是多了几行代码,但是可读性要好很多。

希望大家可以从中学到点什么,另外毕竟是初学,文章漏洞可能会有很多很多,欢迎各位大佬指点!!

 

posted on 2020-11-26 10:36  知交  阅读(704)  评论(0编辑  收藏  举报

导航