打印杨辉三角
杨辉三角又叫帕斯卡三角,是二项式系数在三角形中的一种几何排序,每行端点与结尾的数为1,每行数字左右对称,由1开始逐渐变大,第n行有n个数字,下一行的每个数字等于上一行的左右两个数字之和。杨辉三角是一个比较神奇的三角,从不通的角度看有不同的性质。我们不用去考虑其性质,只考虑怎样将其用代码表示出来。
方法一:
用简单的for循环加简单递归调用的方法将其打印,具体见代码如下:
import java.util.*;
class sanjiao{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("Enter:");
int n = sc.nextInt();
for (int i = 1;i<=n;i++){
for(int k = 1;k<=n-i;k++){//控制前面的三角的空格
System.out.print(" ");
}
for(int j=1;j<=i;j++){//打印杨辉三角的数字
System.out.print(num(i,j)+" ");
}
System.out.println();
}
}
public static int num(int x,int y){//通过递归调用生成每个位置上的数字
if(y==1||y==x){//递归返回的条件,防止无限调用
return 1;//第一行和最后一行都是1
}
int c = num(x-1,y-1)+num(x-1,y);//下一行的值等于上一行的相邻两个位置的数字相加
return c;
}
}
注意:递归调用的函数时候的用法,当每次调用函数时,反复的加1,将上一行的相应位置的数字求出来,然后进行相加,最后返回数字。得到下一行相应位置处的值。
方法二:
用二维数组的方法输出杨辉三角,具体见代码如下:
import java.util.*;
class sanjiao2{
public static void main(String[] agrs){
Scanner sc = new Scanner(System.in);
System.out.println("Enter a number:");
int row = sc.nextInt();
int [][]arr = new int[row][row];
for(int i = 0;i<row;i++){
for(int k = 1;k<=row-i;k++){//打印三角的空格
System.out.print(" ");
}
for(int j = 0;j<=i;j++){
if(j==0||j==i){//三角的每行的第一位和最后一位都是1
arr[i][j] = 1;
}else{
arr[i][j] = arr[i-1][j-1]+arr[i-1][j];//下一行的对应位置上的值等于上一行相应位置上的值之和
}
System.out.print(arr[i][j]+" ");//控制输出
}
System.out.println();
}
}
}
注意:二维数组的方法简单易懂,但是还是要注意一下,打印时三角的行数等于列数,所以在循环判断输出的时候要注意。
方法三:
这个方法比较巧妙,每次用到上一行的值进行加和,但是当每一行的值打印完的时候,per的值被重置,再次进行下一行的变化。具体见代码。
import java.util.*;
class sanjiao3{
public static void main(String[] agrs){
Scanner sc = new Scanner(System.in);
System.out.println("Enter a number:");
int row = sc.nextInt();
int []arr = new int[row+1];
int pre = 1;
for(int i = 0;i<arr.length;i++){
for(int k = 1;k<=arr.length-i;k++){//打印三角的空格
System.out.print(" ");
}
for(int j = 0;j<i;j++){
int con = arr[j];//arr[i]处的值会发生变化,下一次相应位置的值将会被覆盖,初始值为零
arr[j] = pre + con;//最后一行的值为1,刚开始的值也为1,
//因为最后一列的值arr[]的值没有被改变为0
//每次将con的值给pre,记录上一行前一个的值
pre = con;
System.out.print(arr[j]+" ");
}
System.out.println();
}
}
}
注意:在第二个for循环中是最需要注意的,要理解清楚具体是如何实现的,在每次变化的过程中pre,con,arr[j]对应的值的变化,arr[j]的值每次是会变化的,被上一次的值所覆盖的。