杨辉三角是我国古代数学中一颗明珠,关于它的实现算法网络上不胜枚举,各有千秋。博主不才,在面试中遇到这道题虐得体无完肤。记于此以儆效尤。
case1:已知杨辉三角某个值的坐标,求该坐标处的杨辉三角值。
题目:设杨辉三角中行号为i,列号为j,要求实现输入一组行号i,j,输出对应位置的杨辉三角值。
算法解析:递归思想,其两大要素为递归函数以及递归出口。杨辉三角规律当前值等于两肩之和, 此即递归函数,递归出口为杨辉三角塔顶值为1。
代码实现:
public class Yanghui {
public static void main(String[] args) {
//测试打印第7行第7位数的杨辉三角值
System.out.println(yang(7, 7));
}
//递归函数
public static int yang(int i,int j){
//赋初值为1
if(i==0 && j==0){return 1;}
//越界非法值为0
else if(j<0 || j>i){return 0;}
//杨辉三角值递归计算
else{
return yang(i-1, j-1)+yang(i-1, j);
}
}
}
case2:实现杨辉三角金字塔结构打印。
题目:输入行号n(起始值为0),打印输出n+1行的杨辉三角金字塔结构。
算法解析:case1已经实现了输出任意坐标的杨辉三角值,此时只需按金字塔结构循环打印即可。
注:杨辉三角在高位坐标时,由于位数的增加从而破坏了金字塔结构的美观性,此处不再关注。
代码实现:
public class Yanghui {
/** * @author stefan_xiepj * 杨辉三角的算法实现 */
public static void main(String[] args) {
//测试打印7杨辉三角值
YH(7);
}
//杨辉三角函数
public static void YH(int n){
int count=n;
for(int i=0;i<n;i++){
//打印金字塔控制
for(int t=count;t>0;t--){
System.out.print(" ");
}
count--;
//打印杨辉三角值
for(int j=0;j<n;j++){
int m = yangRecursion(i, j);
if(m==0){
continue;
}else{
System.out.print(" "+m+" ");
}
}
//换行
System.out.println();
}
}
//递归函数
public static int yangRecursion(int i,int j){
//赋初值为1
if(i==0 && j==0){return 1;}
//越界值为0
else if(j<0 || j>i){return 0;}
//杨辉三角值递归计算
else{
return yangRecursion(i-1, j-1)+yangRecursion(i-1, j);
}
}
}
测试结果:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1