黑马程序员技术交流社区
标题:
求指教:Java实现杨辉三角
[打印本页]
作者:
王小丑
时间:
2013-2-6 18:47
标题:
求指教:Java实现杨辉三角
在数学上很多人在研究杨辉三角,其实杨辉三角最难实现的部分是下部分中间数字是上面数字之和
如下
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();
}
}
}
作者:
王小丑
时间:
2013-2-6 18:52
补充:利用递归函数来实现时 要输出的杨辉三角的行数须和题目相符合!
作者:
刘凯
时间:
2013-2-6 21:00
public class Yangsan
{
public static void main(String args[])
{
Scanner sc = new Scanner(System.in);
System.out.print("请输入你想计算的行数:");
int x = sc.nextInt();
int arr[][] = new int[x][];
input(arr,x);//存入
print(arr);//输出
}
static void input(int[][] arr,int x)
{
for(int row=0;row<x;row++)
{
arr[row] = new int[row+1];
for(int list=0;list<=row;list++)
{
arr[row][list] = method(row,list);
}
}
}
static void print(int[][] arr)
{
for(int row =0;row<arr.length;row++)
{
for(int list=0;list<=row;list++)
System.out.print(arr[row][list]+"\t");
System.out.println();
}
}
static int method(int row,int list)// 递归
{
if(list<=0||list>= row)
return 1;
return(method(row-1,list)+method(row-1,list-1));
}
}
复制代码
也可以不用定义数组存入 直接调用method方法 得出数来 输出就行
作者:
王小丑
时间:
2013-2-8 22:14
刘凯 发表于 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); //调用自身
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2