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];
这样应该是不允许的吧,必须指定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的。不负责任啊!
第一:创建什么机构的数组
第二:数组付什么样的值
-------------
第一:什么样的数组
代码中创建的是一个数组,每个数组的元素又是一个数组,并且元素数组的维度是递增的。格式类似:
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
当 k=0时,f(n,k)=1
当 k=n时 f(n,k)=1
#5
up>.....
#6
Java没有多维数组。
#7
就是杨辉三角形=。=
你这书解释的也太难懂了吧。。
你这书解释的也太难懂了吧。。
#8
java核心技术里的代码。
LZ不用去深究那个for循环,那个和创建多维数组无关,只是杨辉三角的一个算法。
LZ不用去深究那个for循环,那个和创建多维数组无关,只是杨辉三角的一个算法。
#9
int [][] odd={
{1}, //数组第一个元素也是数组长度1
{1,1}, //数组第二个元素也是数组长度2
{1,1,1}
{1,1,1,1}
……
};
Java没有这样的数组吧
{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还要灵活。
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还要灵活。
#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个,怎样产生结果,不知所云
抽取j个,抽取哪些j个,怎样产生结果,不知所云
#15
这句话说的确实有毛病。
#16
是的喔。。
#17
有吧!
这是书中的例子
我是看JAVA核心技术
#18
你们可以运行一下 看一下结果!
#19
原来是这样
#20
#1
Java没有多维数组。
#2
int[][] odds = new int[NMAX+1][];
这样应该是不允许的吧,必须指定int[][] oods = new int[][10];
这样应该是不允许的吧,必须指定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的。不负责任啊!
第一:创建什么机构的数组
第二:数组付什么样的值
-------------
第一:什么样的数组
代码中创建的是一个数组,每个数组的元素又是一个数组,并且元素数组的维度是递增的。格式类似:
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
当 k=0时,f(n,k)=1
当 k=n时 f(n,k)=1
#5
up>.....
#6
Java没有多维数组。
#7
就是杨辉三角形=。=
你这书解释的也太难懂了吧。。
你这书解释的也太难懂了吧。。
#8
java核心技术里的代码。
LZ不用去深究那个for循环,那个和创建多维数组无关,只是杨辉三角的一个算法。
LZ不用去深究那个for循环,那个和创建多维数组无关,只是杨辉三角的一个算法。
#9
int [][] odd={
{1}, //数组第一个元素也是数组长度1
{1,1}, //数组第二个元素也是数组长度2
{1,1,1}
{1,1,1,1}
……
};
Java没有这样的数组吧
{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还要灵活。
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还要灵活。
#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个,怎样产生结果,不知所云
抽取j个,抽取哪些j个,怎样产生结果,不知所云
#15
这句话说的确实有毛病。
#16
是的喔。。
#17
有吧!
这是书中的例子
我是看JAVA核心技术
#18
你们可以运行一下 看一下结果!
#19
原来是这样