A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王小丑 中级黑马   /  2013-2-6 18:47  /  1381 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在数学上很多人在研究杨辉三角,其实杨辉三角最难实现的部分是下部分中间数字是上面数字之和
如下
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 1
这道题是一个学弟问我的 但是他们老师要求用递归实现 我对递归不是太熟悉 我用二维数组和推导式分别能实现,有没有哪一位高手可以用递归实现,我很想知道答案!下面给出我的程序,不对之处请指教。

第一种:利用二维数组来实现
public class Triangle01 {

public static void main(String[] args) {

/*添加输入你要计算的行数*/
int num;
System.out.println("请输入你想计算的行数:");
Scanner scanner = new Scanner(System.in);
num=scanner.nextInt();

int b[][]=new int[num][num];

for(int j=0;j<num;j++){ //定义行数

for(int k=0;k<=j;k++){ //定义每一行的元素

if(j==0||k==0||k==j){ //先得到两边为1的元素

b[j][k]=1;

}else{ //计算中间不为1的元素

b[j][k]=b[j-1][k-1]+b[j-1][k];//计算值

}
}
}

for(int m=0;m<num;m++){

System.out.println(); //换行

for(int n=0;n<=m;n++){

System.out.print(b
[n]+"\t");//循环输出
}

}

}

}


第二种:利用推导式来实现
public class Triangle02 {

public static void main(String[] args) {

int i,j,k,n;
System.out.println("请输入您要计算的行数:");
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();

for(i=1;i<=n;i++){ //行数i

k=1; //因为每一行都是以1开头

for(j=1;j<=i;j++){ //每行的元素位置j

System.out.print(k+"\t");

//下面这个就是杨辉三角中的推导式
k=k*(i-j)/j; //每行的某个数值跟他行数和位置有关
//k=k*(i-j)/j;就是根据排列组合c(n,x)的值推导出来的

}

System.out.println();

}

}
}




评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1

查看全部评分

3 个回复

倒序浏览
补充:利用递归函数来实现时 要输出的杨辉三角的行数须和题目相符合!
回复 使用道具 举报
  1. public class Yangsan
  2. {
  3. public static void main(String args[])
  4. {

  5. Scanner sc = new Scanner(System.in);
  6. System.out.print("请输入你想计算的行数:");
  7. int x = sc.nextInt();
  8. int arr[][] = new int[x][];
  9. input(arr,x);//存入
  10. print(arr);//输出
  11. }
  12. static void input(int[][] arr,int x)
  13. {
  14. for(int row=0;row<x;row++)
  15. {
  16. arr[row] = new int[row+1];
  17. for(int list=0;list<=row;list++)
  18. {
  19. arr[row][list] = method(row,list);

  20. }
  21. }
  22. }
  23. static void print(int[][] arr)
  24. {
  25. for(int row =0;row<arr.length;row++)
  26. {
  27. for(int list=0;list<=row;list++)
  28. System.out.print(arr[row][list]+"\t");
  29. System.out.println();
  30. }
  31. }
  32. static int method(int row,int list)// 递归
  33. {
  34. if(list<=0||list>= row)
  35. return 1;
  36. return(method(row-1,list)+method(row-1,list-1));
  37. }
  38. }
复制代码
也可以不用定义数组存入 直接调用method方法 得出数来 输出就行

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1

查看全部评分

回复 使用道具 举报
刘凯 发表于 2013-2-6 21:00
也可以不用定义数组存入 直接调用method方法 得出数来 输出就行

谢谢你的关注 我的这方法我试过了 基本上还可以 但是没有充分利用递归算法 所以有点麻烦 我这两天运行出来一种方法 现在分享给大家 多谢大家的支持

public static void main(String[] args) {

int n;
System.out.println("请输入要输出的杨辉三角的行数:");
Scanner scanner = new Scanner(System.in);
n=scanner.nextInt();
output(n);

}

static void output(int n){ //输出杨辉三角
int i,j;
for(i=0;i<=n;i++){ //表示行数

for(j=0;j<=i;j++){ //表示每行的第几个元素

System.out.print(get(i,j)+"\t");
}

System.out.println();
}
}

static int get(int i,int j){//的到每一个元素的值
if (j==0||i==j){
return 1;
}
else{

return get(i-1,j-1)+get(i-1,j); //调用自身

}
}

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马