最近也是刚刚学C语言不到两个月,对于杨辉三角这个经典的题目在此进行记录下,一方面有助于以后的复习,另一方面希望之后能够帮助到像我这样的初学者。
我这里以遇到的题目为例,来研究最简单的那个,也就是类似于这种:
1
1 1
1 2 1
1 3 3 1
………………
这里先给出数组的方法。我所采用的是二维数组,这里先给出代码,具体的分析就请看注释吧。
#include <stdio.h> int main() { int a[100][100],n;//首先自定义一个二维数组和一个控制循环的变量n,也就是你所需打印的行数 printf("输入所打印的行数 "); scanf("%d",&n); a[0][0]=1;//将数组的第一个元素赋值为1,这也就是三角的第一个元素 int i,k; for(i=0;i<=n;i++)//第一个i控制的是行数,进行一次循环会输出一个" " { 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(" "); } 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("输入打印行数 "); scanf("%d",&n); for(i=1;i<=n;i++) { for(k=1;k<=i;k++) { printf("%5d",yhsj(i,k)); } printf(" "); } 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 请按任意键继续. . .
好的,这就是我对于杨辉三角的理解,个人感觉递归的方法其实更加好用,相比于常规的数组来说,看着是多了几行代码,但是可读性要好很多。
希望大家可以从中学到点什么,另外毕竟是初学,文章漏洞可能会有很多很多,欢迎各位大佬指点!!