Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找未排序数组的最大奇数元素的递归算法?_Algorithm_Recursion - Fatal编程技术网

Algorithm 查找未排序数组的最大奇数元素的递归算法?

Algorithm 查找未排序数组的最大奇数元素的递归算法?,algorithm,recursion,Algorithm,Recursion,今天我在期中考试时遇到了这个问题,我的大脑完全融化了,我不知道如何编写伪代码,甚至不知道如何解决这个问题。任何帮助都将不胜感激。这个问题实际上并不需要递归解决方案,但如果需要,请使用分而治之的方法:解决数组左半部分和右半部分的问题,然后从两个结果中选择最大的一个 当数组只有一个值时,就会出现递归的基本情况:在这种情况下,请验证它是否为奇数。如果是,则返回它,否则返回一些默认值。我将取负无穷大,这意味着如果一个数组没有奇数成员,这将是返回值 下面是一个JavaScript实现: 函数greate

今天我在期中考试时遇到了这个问题,我的大脑完全融化了,我不知道如何编写伪代码,甚至不知道如何解决这个问题。任何帮助都将不胜感激。

这个问题实际上并不需要递归解决方案,但如果需要,请使用分而治之的方法:解决数组左半部分和右半部分的问题,然后从两个结果中选择最大的一个

当数组只有一个值时,就会出现递归的基本情况:在这种情况下,请验证它是否为奇数。如果是,则返回它,否则返回一些默认值。我将取负无穷大,这意味着如果一个数组没有奇数成员,这将是返回值

下面是一个JavaScript实现:

函数greatestOdd(arr,first=0,last=arr.length-1){
如果(last==first){//这是一个值
如果(arr[first]%2==1)返回arr[first];//奇数
else返回-无穷大;//偶数
}
让mid=(最后一个+第一个)>>1;
设a=greatestOdd(arr,first,mid);
设b=greatestOdd(arr,mid+1,last);
返回Math.max(a,b);
}

console.log(greatestOdd([5,4,2,7,6,10]);//7
您可以简单地遍历数组并获得最大的奇数。不需要递归,但可以递归地进行遍历,如:

int findLargest(index, arr)
    if ( index == arr.length - 1 )
        if ( arr[index] % 2 != 0 ) return arr[index]
        return MIN_VALUE
    else
        return arr[index] % 2 != 0 ? max(arr[index], findLargest(index + 1, arr)) 
                                   : findLargest(index + 1, arr)
每个元素访问一次,时间复杂度为
O(n)
,但这会使用
O(n)
空间,并可能导致堆栈溢出,因为最终结果需要堆栈上的中间结果

例如:

max(arr[index],findLargest(index+1,arr))
评估为:

max(arr[index],max(arr[index+1],findLargest(index+2,arr))
评估为:

max(arr[index],max(arr[index+1],max(arr[index+2],findLargest(index+3,arr)))
等等

避免堆栈溢出的尾部递归版本:

int findLargestOdd(maxOdd, index, arr)
    if ( index == arr.length-1) return maxOdd;
    return arr[index+1] % 2 != 0 
          ? return findLargestOdd(max(maxOdd, arr[index+1]), index+1, arr)
          : return findLargestOdd(maxOdd, index+1, arr);
在这里,中间结果不需要存储在堆栈上。将结果作为:
max(maxOdd,arr[index])
maxOdd

您可以将此函数称为:

return arr[0] % 2 != 0 
     ? findLargestOdd(arr[0], 0, arr) 
     : findLargestOdd(MIN_VALUE, 0, arr)

请注意,这将使用O(n)堆栈空间,对于较大的阵列,这可能会产生堆栈溢出错误。除非编译器/解析器支持并检测尾部递归。这是两个不同的语句。有一些方法可以避免堆栈溢出,但仍然使用递归。他们要求您在没有特别好处的地方使用递归,这似乎有点不公平。