创建不规则的数组

时间:2022-02-22 23:27:46

class LotteryArray 
{
public static void main(String[] args) 
{
final int NMAX = 10;
int[][] odds = new int[NMAX+1][];
for(int n=0;n<=NMAX;n++){//创建不规则数组
odds[n] = new int[n+1];
}
for(int n=0;n<odds.length;n++)
for(int k=0;k<odds[n].length;k++){
int lotteryOdds = 1;
for(int i=1;i<=k;i++){
lotteryOdds = lotteryOdds*(n-i+1)/i;                             //这个for 我不明白。
}
odds[n][k] = lotteryOdds;
}
for(int[] row:odds){
for(int odd:row)
System.out.printf("%4d",odd);
System.out.println();
}
}
}

书上说:在这个例子中,创建一个数组,第i行第j列将存放"从i个数值中抽取j个数值"产生的结果。

请问一下这句话怎么理解啊?

19 个解决方案

#1


Java没有多维数组。

#2


int[][] odds = new int[NMAX+1][];
这样应该是不允许的吧,必须指定int[][] oods = new int[][10];

#3


代码只表现出了两个意思:
第一:创建什么机构的数组
第二:数组付什么样的值
-------------
第一:什么样的数组
代码中创建的是一个数组,每个数组的元素又是一个数组,并且元素数组的维度是递增的。格式类似:
int [][] odd={
 {1},      //数组第一个元素也是数组长度1
 {1,1},    //数组第二个元素也是数组长度2
 {1,1,1}
 {1,1,1,1}
 ……
};
第二:数组赋什么样的值
在上面示例中,赋值都是1。在代码中赋值语句为:(除第0列)
                int lotteryOdds = 1;
                for(int i=1;i<=k;i++){
                    lotteryOdds = lotteryOdds*(n-i+1)/i;                                             
                }                
                odds[n][k] = lotteryOdds;   
外面的两层for只是变量数组的位置直接忽略不看。
看上面代码,这种代码显然是数学算式转换过来的。数学算式转换的代码可读性都很差。一般转换回去在读。上述代码等价数学表达式:
f(n,k)=lotteryOdds*(n-1+1)/1*(n-2+1)/2……*(n-k+1)/k  //lotteryOdds=1
化简:
f(n,k)=1*(n)/1*(n-1)/2……*(n-(k-1))/k  
格式化:
f(n,k)=1
     *(n)/1
     *(n-1)/2
      ……
     *(n-(k-1))/k 
格式化为递归式:
f(n,k)=f(n-1,k-1)+f(n-1,k)
数组值:
int [][] odd={
 {1},      
 {1,f(1,1)},    
 {1,f(2,1),f(2,2)}
 {1,f(3,1),f(3,2),f(3,3)}
 ……
};
打印结果:
   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
   1   7  21  35  35  21   7   1
   1   8  28  56  70  56  28   8   1

回过头来看那句话:
书上说:在这个例子中,创建一个数组,第i行第j列将存放"从i个数值中抽取j个数值"产生的结果。
从3个数值抽取2个
f(3,2)=f(2,1)+f(2,2)   //从f(2,0) f(2,1) f(2,2)  3个数抽取2个数的结果。

问题解决:另外你这边数很傻冒!估计是作者从别的地方直接copy的。不负责任啊!

#4


上面递归式 省略了 f(x,0)=1  f(x,x)=1
当 k=0时,f(n,k)=1
当 k=n时  f(n,k)=1

#5


引用 3 楼 headsen 的回复:
代码只表现出了两个意思:
第一:创建什么机构的数组
第二:数组付什么样的值
-------------
第一:什么样的数组
代码中创建的是一个数组,每个数组的元素又是一个数组,并且元素数组的维度是递增的。格式类似:
int [][] odd={
 {1},      //数组第一个元素也是数组长度1
 {1,1},    //数组第二个元素也是数组长度2
 {1,1,1}
 ……

up>.....

#6


Java没有多维数组。

#7


就是杨辉三角形=。=
你这书解释的也太难懂了吧。。

#8


java核心技术里的代码。

LZ不用去深究那个for循环,那个和创建多维数组无关,只是杨辉三角的一个算法。

#9


int [][] odd={
 {1}, //数组第一个元素也是数组长度1
 {1,1}, //数组第二个元素也是数组长度2
 {1,1,1}
 {1,1,1,1}
 ……
};

Java没有这样的数组吧

#10


直接把我代码拷进去运行一下。事实胜于一切。
        int [][] odd={{1,2},{1,1,1}};
        for(int i=0;i<odd.length;i++){
         for(int j=0;j<odd[i].length;j++){
         System.out.print(odd[i][j]+" ");
         }
         System.out.println();
        }

Java恰恰只支持一维数组。所谓的所谓数组只是一维衍生出来的。即数组的元素还是数组。java并没有真正的多维数组。这一点和JavaScript很类似。不过JS比Java还要灵活。


引用 9 楼 kuailelxl 的回复:
int [][] odd={
 {1}, //数组第一个元素也是数组长度1
 {1,1}, //数组第二个元素也是数组长度2
 {1,1,1}
 {1,1,1,1}
 ……
};

Java没有这样的数组吧

#11


有这样的数组...

另外再补一下:


  for(int i=1;i<=k;i++){
                    lotteryOdds = lotteryOdds*(n-i+1)/i; //这个for 我不明白。                                           //这个for循环产生的数是 二项式 C  n取k
                }      

#12


我晕,打的字怎么没了。

  for(int i=1;i<=k;i++){
              //这个for循环产生的数是 二项式 C  n取k
                    lotteryOdds = lotteryOdds*(n-i+1)/i; //这个for 我不明白。                                           
                }     

#13


长只是了

#14


第i行第j列将存放"从i个数值中抽取j个数值"产生的结果。

抽取j个,抽取哪些j个,怎样产生结果,不知所云

#15


这句话说的确实有毛病。

引用 14 楼 dracularking 的回复:
第i行第j列将存放"从i个数值中抽取j个数值"产生的结果。

抽取j个,抽取哪些j个,怎样产生结果,不知所云

#16


引用 1 楼 huntor 的回复:
Java没有多维数组。

是的喔。。

#17


引用 1 楼 huntor 的回复:
Java没有多维数组。

有吧!
这是书中的例子
我是看JAVA核心技术

#18


你们可以运行一下 看一下结果!

#19


引用 8 楼 apeipo 的回复:
java核心技术里的代码。

LZ不用去深究那个for循环,那个和创建多维数组无关,只是杨辉三角的一个算法。

原来是这样

#1


Java没有多维数组。

#2


int[][] odds = new int[NMAX+1][];
这样应该是不允许的吧,必须指定int[][] oods = new int[][10];

#3


代码只表现出了两个意思:
第一:创建什么机构的数组
第二:数组付什么样的值
-------------
第一:什么样的数组
代码中创建的是一个数组,每个数组的元素又是一个数组,并且元素数组的维度是递增的。格式类似:
int [][] odd={
 {1},      //数组第一个元素也是数组长度1
 {1,1},    //数组第二个元素也是数组长度2
 {1,1,1}
 {1,1,1,1}
 ……
};
第二:数组赋什么样的值
在上面示例中,赋值都是1。在代码中赋值语句为:(除第0列)
                int lotteryOdds = 1;
                for(int i=1;i<=k;i++){
                    lotteryOdds = lotteryOdds*(n-i+1)/i;                                             
                }                
                odds[n][k] = lotteryOdds;   
外面的两层for只是变量数组的位置直接忽略不看。
看上面代码,这种代码显然是数学算式转换过来的。数学算式转换的代码可读性都很差。一般转换回去在读。上述代码等价数学表达式:
f(n,k)=lotteryOdds*(n-1+1)/1*(n-2+1)/2……*(n-k+1)/k  //lotteryOdds=1
化简:
f(n,k)=1*(n)/1*(n-1)/2……*(n-(k-1))/k  
格式化:
f(n,k)=1
     *(n)/1
     *(n-1)/2
      ……
     *(n-(k-1))/k 
格式化为递归式:
f(n,k)=f(n-1,k-1)+f(n-1,k)
数组值:
int [][] odd={
 {1},      
 {1,f(1,1)},    
 {1,f(2,1),f(2,2)}
 {1,f(3,1),f(3,2),f(3,3)}
 ……
};
打印结果:
   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
   1   7  21  35  35  21   7   1
   1   8  28  56  70  56  28   8   1

回过头来看那句话:
书上说:在这个例子中,创建一个数组,第i行第j列将存放"从i个数值中抽取j个数值"产生的结果。
从3个数值抽取2个
f(3,2)=f(2,1)+f(2,2)   //从f(2,0) f(2,1) f(2,2)  3个数抽取2个数的结果。

问题解决:另外你这边数很傻冒!估计是作者从别的地方直接copy的。不负责任啊!

#4


上面递归式 省略了 f(x,0)=1  f(x,x)=1
当 k=0时,f(n,k)=1
当 k=n时  f(n,k)=1

#5


引用 3 楼 headsen 的回复:
代码只表现出了两个意思:
第一:创建什么机构的数组
第二:数组付什么样的值
-------------
第一:什么样的数组
代码中创建的是一个数组,每个数组的元素又是一个数组,并且元素数组的维度是递增的。格式类似:
int [][] odd={
 {1},      //数组第一个元素也是数组长度1
 {1,1},    //数组第二个元素也是数组长度2
 {1,1,1}
 ……

up>.....

#6


Java没有多维数组。

#7


就是杨辉三角形=。=
你这书解释的也太难懂了吧。。

#8


java核心技术里的代码。

LZ不用去深究那个for循环,那个和创建多维数组无关,只是杨辉三角的一个算法。

#9


int [][] odd={
 {1}, //数组第一个元素也是数组长度1
 {1,1}, //数组第二个元素也是数组长度2
 {1,1,1}
 {1,1,1,1}
 ……
};

Java没有这样的数组吧

#10


直接把我代码拷进去运行一下。事实胜于一切。
        int [][] odd={{1,2},{1,1,1}};
        for(int i=0;i<odd.length;i++){
         for(int j=0;j<odd[i].length;j++){
         System.out.print(odd[i][j]+" ");
         }
         System.out.println();
        }

Java恰恰只支持一维数组。所谓的所谓数组只是一维衍生出来的。即数组的元素还是数组。java并没有真正的多维数组。这一点和JavaScript很类似。不过JS比Java还要灵活。


引用 9 楼 kuailelxl 的回复:
int [][] odd={
 {1}, //数组第一个元素也是数组长度1
 {1,1}, //数组第二个元素也是数组长度2
 {1,1,1}
 {1,1,1,1}
 ……
};

Java没有这样的数组吧

#11


有这样的数组...

另外再补一下:


  for(int i=1;i<=k;i++){
                    lotteryOdds = lotteryOdds*(n-i+1)/i; //这个for 我不明白。                                           //这个for循环产生的数是 二项式 C  n取k
                }      

#12


我晕,打的字怎么没了。

  for(int i=1;i<=k;i++){
              //这个for循环产生的数是 二项式 C  n取k
                    lotteryOdds = lotteryOdds*(n-i+1)/i; //这个for 我不明白。                                           
                }     

#13


长只是了

#14


第i行第j列将存放"从i个数值中抽取j个数值"产生的结果。

抽取j个,抽取哪些j个,怎样产生结果,不知所云

#15


这句话说的确实有毛病。

引用 14 楼 dracularking 的回复:
第i行第j列将存放"从i个数值中抽取j个数值"产生的结果。

抽取j个,抽取哪些j个,怎样产生结果,不知所云

#16


引用 1 楼 huntor 的回复:
Java没有多维数组。

是的喔。。

#17


引用 1 楼 huntor 的回复:
Java没有多维数组。

有吧!
这是书中的例子
我是看JAVA核心技术

#18


你们可以运行一下 看一下结果!

#19


引用 8 楼 apeipo 的回复:
java核心技术里的代码。

LZ不用去深究那个for循环,那个和创建多维数组无关,只是杨辉三角的一个算法。

原来是这样

#20