这是原始问题:
编写一个名为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);
}
答案 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
修饰符。)
就个人而言,我认为第一种方法更优雅,尽管你的导师告诉你要使用第一种元素。