递归地在数组中查找赔率的乘积

时间:2014-11-21 18:34:34

标签: java recursion

这是原始问题:

编写一个名为productOfOdds的递归的int值方法,该方法接受整数数组和数组中元素的数量,并返回数组中奇数元素的乘积。您可以假设该数组至少有一个奇值元素。递归地计算整数值数组的奇值元素的乘积可以如下计算:

  • 如果数组有一个元素并且它是奇数,则返回该元素的值;否则返回1.

  • 否则,如果数组的第一个元素是奇数,则返回该元素的乘积以及查找数组其余部分奇数元素乘积的结果;如果第一个元素不是奇数,只需返回查找数组其余部分奇数元素乘积的结果。

这就是我所拥有的,我无法弄清楚为什么它不起作用:

public static int productOfOdds(int[] arr, int index)
{
    if (index == 1) 
    { 
        if ((arr[0]%2) != 0)  
            return arr[0]; 
        else 
            return 1; 
    }
    else if ((arr[0] % 2) != 0)           
        return (arr[0] * productOfOdds(arr, index - 1));            
    else
        return productOfOdds(arr, index - 1);
}

3 个答案:

答案 0 :(得分:0)

我相信这一部分:

else if ((arr[0] % 2) != 0) 
    return (arr[0] * productOfOdds(arr, index - 1)); 

你想说:

else if ((arr[index] % 2) != 0) 
    return (arr[index] * productOfOdds(arr, index - 1));

在此使用0代替index,您的结果将始终为

  • 1如果arr[0]甚至是
  • arr[0]如果是奇数

答案 1 :(得分:0)

问题在于,当您传入索引时,您不会检查索引处的数组值,但是数组值为0.这应该可以解决问题:

public static int productOfOdds(int[] arr, int index){
    if (index == 1) 
    { 
        if ((arr[index-1]%2) != 0)  
             return arr[index-1]; 
        else 
             return 1; 

    }

    else if((arr[index-1]%2) != 0 )           
         return (arr[index-1] * productOfOdds(arr, index-1));            
    else
         return productOfOdds(arr, index-1);            
}

答案 2 :(得分:0)

它不起作用的原因是你从不计算任何不是第一个数组元素的东西。在你的递归中没有任何东西导致它转到第二个元素,第三个元素,依此类推。

可能令人困惑的是,表示数组 length 的参数称为index。但你像对待长度一样对待它。无论如何,让我们看看你在这里做了什么:

您的结束条件似乎很好 - 如果 length 为1,则测试唯一存在的元素,并按照分配文本的指示进行操作。

但是递归步骤呢?

假设你有两个元素,第一个是奇数。您的index是2.所以您使用相同的数组和1调用相同的函数。这将返回零位置的元素值。然后将它乘以位置零处的元素。如果你的数组是8个元素长,它仍然会乘以相同的第一个元素,所以你基本上得到(arr [0]) length (如果它是奇数)或1(如果它并不奇怪。

您有两种方法可以解决此问题。

仅使用一个参数,但针对作业的文本

为此,您必须检查数组的 last 元素。因此,如果您的数组长度为1,那么就像您到目前为止所做的那样。但如果它大于1,你必须这样做:

if ( arr[index-1]%2 != 0 ) {
    return arr[index-1]*productOfOdds(arr,index-1);
} else {
    return productOfOdds(arr,index-1);
}

使用两个参数,但请遵循作业字母

为此,您还必须传递说明子阵列开始位置的参数。也就是说,检查数组的第一个元素,但是告诉递归步骤从第二个元素向前检查。基本上,你告诉你的方法"看看这个数组,好像它从位置startIndex而不是0"开始。

private static int productOfOdds(int[] arr, int startIndex, int length) {
    if (length == 1)  { 
        if ((arr[startIndex]%2) != 0)  
            return arr[startIndex]; 
        else 
            return 1; 

    } else if((arr[startIndex]%2) != 0 )           
         return (arr[startIndex] * productOfOdds(arr, startIndex + 1, length-1));            
    else
         return productOfOdds(arr, startIndex+1, length-1));            
}

public static int productOfOdds(int[] arr, int length ) {
    return productOfOdds( arr, 0, length );
}

只有两个参数的第二个方法是为了遵循你的赋值字母,即只有一个接受数组及其长度的方法。在内部,它使用三个参数,但对于世界,您提出了一个双参数方法(请注意private vs public修饰符。)

就个人而言,我认为第一种方法更优雅,尽管你的导师告诉你要使用第一种元素。