繁体   English   中英

数组递归练习

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM