使这个功能更加优雅" C ++

时间:2017-03-10 07:39:21

标签: c++ performance recursion processing-efficiency

有没有让这个递归函数更优雅?我想制作这个功能,所以没有重复的代码。

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);
    }
}

6 个答案:

答案 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());