当前位置: 技术问答>java相关
《core java》里两个算法没看懂,哪位指点指点
来源: 互联网 发布时间:2015-02-10
本文导语: 中文版1卷里p62。3.9递归算法中说 接下来,我们来看看递U3法是怎样计算彩票中奖率的。如果从50个号码中抽出1个号码。 很简单,你的机会就是50分之1。一般情况下,我们可将此写成 public static long lotteryOdds(int high,...
中文版1卷里p62。3.9递归算法中说
接下来,我们来看看递U3法是怎样计算彩票中奖率的。如果从50个号码中抽出1个号码。
很简单,你的机会就是50分之1。一般情况下,我们可将此写成
public static long lotteryOdds(int high, int number)
{ if(number == 1) return high;
...
}
还不算太槽!现在,我们来看看从50个号码中抽6个号码的中奖可能性。随便乱抓一个号
码。就有50次机会。另外,还要从49个号码中抽5个号码。啊哈[一个简单得不得了的问题。
抽出5个号码就有lotteryOdds(49,5)种方法。我们就有50*lottery0dds(49,5)种选出这6个号码的
的可能性.事实上,我们必须做点傻事、并把其结果除以6,为什么呢?因为程序根据我们首选
的号码,对每个组合都进行了6次计算。
把50和6替换成常规参数——high和number,得到的递归法就是
public static long lotteryOdds(int high, int number)
( if (number <= O) return 0; // just in case
elSe if (number == 1) return high;
else return high*loteryOdds(high — l,number — 1) // number;
}
注意,每次递归调用中,number参数在逐渐减少,而且,最终递减至1和0。在编写递归方
法时,这一点是相当重要的:你必须确定递归终止。
******我还是不明白为什么要除以6。那句对每个组合都进行了6次计算。指的什么组合的计算。
####################################################################
问题2:p65 3.10.3
3.10.3数组作为返回值使用
方法的返回值类型也可以做为一个数组。一个方法在计算一序列值时,这一点才真正有了
用武之地。比如,我们来写一个方法(从一次模拟彩票中抽出一系列号码),并返回一个序列
号。方法头是:
public static int drawing(int high, int number)
在例3.9中,这个方法制作了两个数组,一个容纳了号码1、2、3……hi9h,幸运号码就是
从这些号码中抽出来的。另一个数组容纳的是抽出来的号码。当这个方法退出时,第一个数组
就会被丢弃,并最终被当作垃圾回收。这个方法将第二个数组当作自己的值返回。
程序
/**
* @version 1.00 07 Feb 1996
* @author Cay Horstmann
*/
import java.util.*;
import corejava.*;
public class LotteryDrawing
{ public static int[] drawing(int high, int number)
{ int i;
int numbers[] = new int[high];
int result[] = new int[number];
// fill an array with numbers 1 2 3 . . . high
for (i = 0; i
接下来,我们来看看递U3法是怎样计算彩票中奖率的。如果从50个号码中抽出1个号码。
很简单,你的机会就是50分之1。一般情况下,我们可将此写成
public static long lotteryOdds(int high, int number)
{ if(number == 1) return high;
...
}
还不算太槽!现在,我们来看看从50个号码中抽6个号码的中奖可能性。随便乱抓一个号
码。就有50次机会。另外,还要从49个号码中抽5个号码。啊哈[一个简单得不得了的问题。
抽出5个号码就有lotteryOdds(49,5)种方法。我们就有50*lottery0dds(49,5)种选出这6个号码的
的可能性.事实上,我们必须做点傻事、并把其结果除以6,为什么呢?因为程序根据我们首选
的号码,对每个组合都进行了6次计算。
把50和6替换成常规参数——high和number,得到的递归法就是
public static long lotteryOdds(int high, int number)
( if (number <= O) return 0; // just in case
elSe if (number == 1) return high;
else return high*loteryOdds(high — l,number — 1) // number;
}
注意,每次递归调用中,number参数在逐渐减少,而且,最终递减至1和0。在编写递归方
法时,这一点是相当重要的:你必须确定递归终止。
******我还是不明白为什么要除以6。那句对每个组合都进行了6次计算。指的什么组合的计算。
####################################################################
问题2:p65 3.10.3
3.10.3数组作为返回值使用
方法的返回值类型也可以做为一个数组。一个方法在计算一序列值时,这一点才真正有了
用武之地。比如,我们来写一个方法(从一次模拟彩票中抽出一系列号码),并返回一个序列
号。方法头是:
public static int drawing(int high, int number)
在例3.9中,这个方法制作了两个数组,一个容纳了号码1、2、3……hi9h,幸运号码就是
从这些号码中抽出来的。另一个数组容纳的是抽出来的号码。当这个方法退出时,第一个数组
就会被丢弃,并最终被当作垃圾回收。这个方法将第二个数组当作自己的值返回。
程序
/**
* @version 1.00 07 Feb 1996
* @author Cay Horstmann
*/
import java.util.*;
import corejava.*;
public class LotteryDrawing
{ public static int[] drawing(int high, int number)
{ int i;
int numbers[] = new int[high];
int result[] = new int[number];
// fill an array with numbers 1 2 3 . . . high
for (i = 0; i