有没有让这个递归函数更优雅?我想制作这个功能,所以没有重复的代码。
int findMaximumValue(int list[], int first, int last)
{
if (first == last)
return list[first];
else {
if (list[first] > findMaximumValue(list, first + 1, last))
return list[first];
else
return findMaximumValue(list, first + 1, last);
}
}
答案 0 :(得分:2)
有两个的东西立刻浮现在脑海中:
if ... then return else ...
范例,因为return
会使else
变得多余。进行这些更改会给你类似的东西:
int findMaximumValue(int list[], int first, int last) {
// List has one item, return it.
if (first == last)
return list[first];
// Get largest of all but first element in list.
int maxOfAllButFirst = findMaximumValue(list, first + 1, last);
// First is larger than all those others, return it.
if (list[first] > maxOfAllButFirst)
return list[first];
// Otherwise it's largest from the others.
return maxOfAllButFirst;
}
我应该提一下,递归最好是针对解决方案空间快速减少的算法(例如二进制搜索,在每次递归调用时丢弃剩余解决方案空间的一半)。
对解决方案空间缓慢减少的事物使用递归(例如,这基本上是线性搜索)并不是最好的主意。如果它不能进行尾调用优化,你可能会很快耗尽堆栈空间。
换句话说,使此算法更优雅的最佳方法是将其从递归算法变为迭代算法: - )
答案 1 :(得分:1)
如果允许使用标准库中的函数,则可以将函数简化为:
int findMaximumValue(int list[], int first, int last)
{
if (first == last)
return list[first];
return std::max(list[first], findMaximumValue(list, first + 1, last));
}
如果不允许使用标准库中的任何函数,请编写自己的max
函数并使用它。
答案 2 :(得分:0)
是的,您可以计算从倒数第二个到最后一个元素的最大值,将其保存到变量然后使用它:
int findMaximumValue(int list[], int first, int last)
{
if (first == last)
return list[first];
else {
int maxFromSecond = findMaximumValue(list, first + 1, last);
if (list[first] > maxFromSecond)
return list[first];
else
return maxFromSecond;
}
}
或者,另一方面,您可以使用函数max(int, int)
缩短您的功能:
int findMaximumValue(int list[], int first, int last)
{
if (first == last)
return list[first];
else
return max(list[first], findMaximumValue(list, first + 1, last));
}
答案 3 :(得分:0)
这是一个替代方案,使用next = 1,last =使用list的项目数量和currMax作为列表的第一项进行调用
int findMaximumValue(int list[], int nextIndex, int last, int currMax)
{
if (nextIndex == last)
return currMax;
int max = list[nextIndex] > currMax ? list[nextIndex] : currMax;
return findMax(list, ++nextIndex, last, max);
}
答案 4 :(得分:0)
最优雅的代码;)
int findMaximumValue(void* list, int nextIndex, int last, int sizeofelem)
{
int result;
__asm {
push eax
push ecx
push esi
push edi
mov eax, nextIndex
mov ecx, eax
mul sizeofelem
mov esi, list
add esi, eax
mov edi, esi
next:
cmp ecx, last
je stop
comp:
add esi, sizeofelem
inc ecx
mov eax, [edi]
cmp eax, [esi]
jl setgrte
jmp next
setgrte:
mov edi, esi
jmp next
stop:
mov eax, [edi]
mov [result], eax
pop edi
pop esi
pop ecx
pop eax
}
return result;
}
//.....
int res = findMaximumValue((void*)&arr, lov, hiv, sizeof(int));
答案 5 :(得分:0)
如何摆脱你的功能并使用这个标准算法:
std::max_element(list, list + len);
http://www.cplusplus.com/reference/algorithm/max_element/
或对列表进行排序:
int myints[] = {32,71,12,45,26,80,53,33};
std::vector<int> myvector (myints, myints+8); // 32 71 12 45 26 80 53 33
std::sort(myvector.begin(), myvector.end(), std::greater<>()); //sort descending
return *(myvector.begin());