首页 文章

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

提问于
浏览
-1

这是原始问题:

编写一个名为 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.这应该可以解决问题:

    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);            
    }
    
  • 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] 如果是奇数

  • 0

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

    可能令人困惑的是表达数组长度的参数称为 index . 但是你在这里看到你在做什么:

    你的结束条件似乎很好 - 如果长度为1,则测试唯一存在的元素,并按照赋值文本告诉你这样做 .

    但是递归步骤呢?

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

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

    Go with only one parameter, but against the text of the assignment

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

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

    Go with two parameters, but follow the letter of the assignment

    为此,您还必须传递说明子数组开始位置的参数 . 也就是说,检查数组的第一个元素,但是告诉递归步骤从第二个元素向前检查 . 基本上,你告诉你的方法“看看这个数组好像是从位置 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 修饰符) .

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

相关问题