数组递归运动

时间:2018-04-22 11:29:12

标签: java arrays recursion

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);
    }
}

3 个答案:

答案 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);
  }
}