【问题标题】:Return set of numbers in recursion递归返回一组数字
【发布时间】:2010-11-04 14:15:04
【问题描述】:

以下代码搜索多项式函数的一个零点。它使用递归技术:

    private static double funktion(int[] koef, double x){
        return koef[0] * Math.pow(x,4) + koef[1] * Math.pow(x,3) + 
               koef[2] * Math.pow(x,2) + koef[3]*x + koef[4]; 
    }

    private static double nullstelle(double a, double b, int[] koef){
        double middle = (a + b)/2;
        double result = middle; 
        if(Math.abs(a-b) > 0.00001){
            double sin = funktion(koef, middle);
            if(sin == 0){
                result = middle;
            }else if(Math.signum(funktion(koef, a)) == 
                             Math.signum(funktion(koef, middle))){
                result = nullstelle(middle, b, koef);
            }else{
                result = nullstelle(a, middle, koef);
            }
        }
        return result;
    }

我想知道如何返回所有零分。我的想法是使用数组,但我不知道该怎么做。有什么想法吗?

我不允许使用除数组以外的任何东西(例如,不允许使用哈希表或集合)

【问题讨论】:

标签: java arrays recursion


【解决方案1】:

我会将诸如 HashSet 之类的集合传递给您的函数,并将您发现的所有数字放入其中。

正如你所说你只能使用数组,那么你知道可以找到的最大零点数,大概,所以创建一个该大小的数组,将 NaN 分配给每个元素,然后传入该数组和每个函数调用的最大当前索引。您需要返回数组的新大小作为结果,以便您始终知道找到了多少个数字。

【讨论】:

  • 我更新了我的问题。我不允许使用除数组之外的任何东西。
  • 啊,这是作业吗?您应该在将来标记问题,以避免答案暗示不同的 API/库。
【解决方案2】:

这里是一些解释,因为这是家庭作业:

1) 我们需要创建一个用于存储零点的数据类型的数组。我的猜测是双重的。
2) 数组将需要某种类型的起始大小,为了讨论,假设为 10
3)在nullstelle方法中,我们将向step 1中创建的数组添加一个元素
4) 如果数组的大小为LIMIT -1,我们将数组复制到一个大小等于LIMIT * 2的新数组中
5) 我们现在返回这个数组。

如果需要对其进行排序,我们可以使用要决定的任何排序技术遍历列表。

【讨论】:

    【解决方案3】:

    首先,您的解决方案存在与your previous question 相同的问题之一,因为您不能保证您会得到完全正确的零计算。不幸的是,这一次您不能使用检查 a 和 b 符号相反的简单解决方案,因为对于任意多项式,零不一定意味着函数穿过 y = 0 线,例如y = x^4。

    无论如何,回答你的问题:

    1. 创建一个大小为 4、类型为 Double 的数组。使用 null 表示数组槽为空。由于您的函数是四次函数,因此最多有四个零。
    2. 将数组作为参数传递给您的函数。
    3. 当您检测到零时,用零值填充数组中剩余的第一个空闲槽。

    没有提供实际的 Java,因为这是家庭作业。

    【讨论】:

    • 嗯,所以:double[] zeros = new double[3]?要将双精度保存到此数组插槽之一,我是否必须使用索引来指定插槽?我会在 if(sin == 0) 语句中这样做...
    • 是,除了new Double[4],因为四次方可以有四个零。
    • 索引 0 1 2 3 将是 4 个元素。在 3 中,您说填写第一个空闲位置。这意味着我必须通过它的索引来处理这个插槽,我不能只做 add(zero)。那我该怎么做呢?
    • @ArtWorkAD:这就是为什么我说使用Double 而不是double。您不能使用 0 表示非值的原因是 0 可能是答案之一。你需要array[freeSlot] = new Double(middle);
    • 我测试了它,但它不起作用。我在 sin == 0 语句的 result = middle 之后添加了一个 System.out.println(result) 但它不打印任何超过 -1.29 的内容....oO
    【解决方案4】:

    Math.pow 是一个非常昂贵的函数。您可以使用嵌套表达式完全避免它。 (而且更短)

    private static double funktion(int[] koef, double x){
         return (((koef[0] * x + koef[1]) * x + 
               koef[2]) * x + koef[3]) * x + koef[4]; 
    }
    

    【讨论】:

      【解决方案5】:
       public double[] returnOnlyZeros(int[] whatever1, double whatever2) {
        double[] result = new double[/*put the size here*/];
      
        // your math here
      
        // put the values into the result array
      
        return result;
       }
      

      【讨论】:

      • 如果您从一开始就不知道最终大小,请注意@Woot4Moo 所说的关于调整数组大小的内容。
      猜你喜欢
      • 2013-08-07
      • 2022-01-02
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 2015-10-23
      • 2015-04-27
      • 2019-01-12
      相关资源
      最近更新 更多