【问题标题】:Array Recursion Excercise数组递归练习
【发布时间】:2018-04-22 11:29:12
【问题描述】:

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

【问题讨论】:

  • 传统上,Java 中的方法名以小写开头
  • 如果 random 函数产生 int 数,为什么数组包含双数?
  • @c0der 感谢您的编辑!

标签: java arrays recursion


【解决方案1】:

我可以帮你解决 b) 您可以将差异存储在原始数组本身中:
[0] 和 [1] 的区别放在 [0] 中,
[2] 和 [3] 的差异放入 [1], 等等。
您可以计算索引以从配对的索引中放置结果,或者为结果和挑选配对保留两个索引变量。
您只需反复迭代原始数组,每次迭代更少的单元格,直到只剩下两个单元格。

递归解决方案应该是明确的......

【讨论】:

  • 看来应该是不相交对的差异,0-1、2-3等
  • 刚刚注意到这一点。相应地更正了答案,谢谢。
【解决方案2】:

我猜选项 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];
}

【讨论】:

    【解决方案3】:
    /* 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);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 2012-07-02
      • 2017-02-10
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 2017-11-12
      相关资源
      最近更新 更多