a)创建一个随机数组,其大小为2的幂。使用循环,找出每对值的差异(索引0& 1,2& 3,4& 5等)并将它们存储在一个新数组中。然后找出每对差异的差异,依此类推,直到你只剩下一个差异。 提示:仔细考虑你的循环边界
b)现在,创建一个“就地”的解决方案,即它不需要创建新的数组。同样,这需要仔细考虑循环边界。
c)最后,编写一个使用递归函数而不是循环的解决方案。
我一直试图解决上面的练习,但我坚持使用什么意思,我怎么能使用递归函数。以下是我对第一部分的解决方案:
public class RandomArray{
private static double ArrayFn(int p){
double[] orignalArray = new double[(int)Math.pow(2,p)];
for (int i = 0; i< orignalArray.length; i++){
orignalArray[i] = (int)(Math.random() * 10) ;
}
System.out.println(Arrays.toString(orignalArray));
double y = ArrayDifferenceloop(orignalArray);
System.out.println("Value of Array" + y);
return y;
}
private static double ArrayDifferenceloop(double[] arg){
do{
double[] newArr = new double[(arg.length/2)];
for (int i = 0; i< arg.length; i+=2){
newArr[i/2] = arg[i] - arg[i+1];
}
System.out.println("New Array is =" + Arrays.toString(newArr));
//copy newArr to arg
arg = new double[(newArr.length)];
System.arraycopy(newArr,0,arg,0,newArr.length);
}while(arg.length > 1);
return arg[0];
}
public static void main(String[] args){
double z = ArrayFn(3);
System.out.println("value" + z);
}
}
答案 0 :(得分:2)
我可以帮助你了解b)
您可以将差异存储在原始数组中:
[0]和[1]的差异放在[0],中
[1]中[2]和[3]的区别,
等等。
您可以计算索引以将结果放在货币对的索引中,或者为结果保留两个索引变量并选择货币对。
你只需要反复遍历原始数组,每次都会停留更少的单元格,直到只剩下两个单元格。
递归解决方案应该清楚......
答案 1 :(得分:0)
我猜选项b意味着使用原始数组存储差异,而不是创建新数组 这可以通过动态更改所用元素的有效范围,忽略其他元素来实现(另请参阅Sharon Ben Asher answer):
private static double ArrayDifferenceloop(double[] array){
int activeLength = array.length;
do{
int index =0; //index where to store difference
for (int i = 0; i< activeLength; i+=2){
array[index++] = array[i] - array[i+1];
}
System.out.println("Modified array (only "+index+ " elements are significant) " + Arrays.toString(array));
activeLength /=2;
}while(activeLength > 1);
return array[0];
}
答案 2 :(得分:-2)
/* Solution for part (b) hope it works for you*/
public class RandomArray{
static int len; /*modification*/
private static double ArrayFn(int p){
double[] orignalArray = new double[(int)Math.pow(2,p)];
len=(int)Math.pow(2,p);
for (int i = 0; i< orignalArray.length; i++){
orignalArray[i] = (int)(Math.random() * 10) ;
}
System.out.println(Arrays.toString(orignalArray));
double y = ArrayDifferenceloop(orignalArray);
System.out.println("Value of Array" + y);
return y;
}
private static double ArrayDifferenceloop(double[] arg){
do{
for (int i = 0; i< len; i+=2){ /*modification*/
arg[i/2] = arg[i] - arg[i+1];
}
//copy newArr to arg
//arg = new double[(arg.length)];
len=len/2; /*modification*/
System.out.print("new Array : ");
for(int i=0;i<len;i++){
System.out.print(arg[i]+" , ");
}
// System.arraycopy(arg,0,arg,0,len);
}while(len > 1);
return arg[0];
}
public static void main(String[] args){
double z = ArrayFn(3);
//System.out.println(Arrays.toString(orignalArray));
System.out.println("value" + z);
}
}