[英]Array Recursion Excercise
a)创建一个随机数数组,其大小为2的幂。使用循环,找到每对值(索引0和1、2和3、4和5等)的差并将其存储在新的数组。 然后找到每对差异的差异,依此类推,直到只剩下一个差异。 提示:请仔细考虑您的循环界限
b)现在,创建一个“就地”的解决方案,即它不需要创建新的阵列。 同样,这将需要仔细考虑循环界限。
c)最后,编写一个使用递归函数而不是循环的解决方案。
我一直在尝试解决上述问题,但是我对b的含义以及如何使用递归函数感到困惑。 以下是我对a部分的解决方案:
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);
}
}
我可以为您提供帮助b)您可以将差异存储在原始数组本身中:
[0]与[1]之差放在[0]中,
[2]和[3]之差放在[1]中,依此类推。
您可以计算索引以从对的索引中放入结果,或者保留两个索引变量以用于结果和挑选对。
您只需重复迭代原始数组,每次迭代在较少的单元格上,直到只剩下两个单元格即可。
递归解决方案应该很清楚...
我猜选项b意味着使用原始数组存储差异,而不是创建新数组。
这可以通过动态更改所使用元素的有效范围而忽略其他元素来实现(另请参见Sharon Ben Asher答案 ):
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];
}
/* 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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.