在递归c ++中找到max in array的位置

时间:2017-04-27 17:09:26

标签: c++ recursion max

我已经使用此函数来查找最大元素 它适用于某些情况,但在其他情况下它出错了,这就是我用函数调用函数的情况。

int maxElement=maxi(names,noOfTeams,0,1,sum,0)

这是功能:

  int maxi(string names[],int sizee,int prev,int next,int scores[],int maxx)
{
    if (sizee ==1)return 0;
    if (scores[maxx]<scores[next]) maxx=next;
    if ((next+1)==sizee)return maxx;
    else return maxi(names,sizee,prev+1,next+1,scores,maxx);

}

3 个答案:

答案 0 :(得分:1)

以下可能是更好的方法:

遍历数组的每个元素,直到数组中剩下的元素为基本情况。 然后在每个函数调用中检查当前索引处的元素是否大于在maxIndex处找到的元素,如果这样更新最大索引并通过再次调用函数检查下一个数组元素,依此类推。

请查找以下代码,以便递归查找最大元素和最大索引:

#include <iostream>

using namespace std;

int findMax(int arr[], int size,int index, int max);
int findMaxIndex(int arr[], int size,int index, int maxIndex);

int main()
{
    int arr[] = {5,2,8,1,4};
    int len = sizeof(arr) / sizeof(int);

    cout << "Max is: " << findMax(arr, len, 0, arr[0]) << endl;
    cout << "Max Index is: " << findMaxIndex(arr, len, 0, 0) << endl;

    return 0;
}


int findMax(int arr[], int size, int index, int max)
{
    if (index == size)
        return max;

    if (arr[index] > max)
        max = arr[index];

    return findMax(arr, size, index + 1, max);
}

int findMaxIndex(int arr[], int size, int index, int maxIndex)
{
    if (index == size)
        return maxIndex;

    if (arr[index] > arr[maxIndex])
        maxIndex = index;

    return findMaxIndex(arr, size, index + 1, maxIndex);
}

答案 1 :(得分:1)

你的功能有几处错误。

  1. 该行

    else if (scores[prev]<scores[next])maxx=next;
    

    需要

    else if (scores[maxx]<scores[next])maxx=next;
    //              ^^^^
    
  2. 您在递归调用中缺少return。而不是

    else maxi(names,sizee,prev+1,next+1,scores,maxx);
    

    它需要

    else
       return maxi(names,sizee,prev+1,next+1,scores,maxx);
    
  3. 此外,该功能可以简化。

    1. 根本没有使用参数name。它可以删除。
    2. 论证prev也可以删除。
    3. 您所拥有的几项支票可合并为一份。
    4. 您不需要一系列if-else-else语句。
    5. 这是一个简化版本。

      int maxi(int sizee, int next, int scores[], int maxx)
      {
         if ( sizee == next )
            return maxx;
      
         if (scores[maxx] < scores[next])
            maxx=next;
      
         return maxi(sizee, next+1, scores, maxx);
      }
      

      更重要的是,最好让函数重载:

      int maxi(int sizee, int scores[]);
      

      那应该是面向用户的功能。面向用户的函数的实现可以使用递归函数作为实现细节。

      int maxi(int sizee, int scores[])
      {
         return maxi(sizee, 0, scores, 0);
      }
      

      http://ideone.com/chvtPA处查看它。

答案 2 :(得分:0)

您需要将scores[maxx]scores[next]进行比较,因为您不需要prev

将您的功能更改为

int maxi(string names[],int sizee,int next,int scores[],int maxx)
{
    if (sizee ==1)
        return 0;
    if (scores[maxx]<scores[next])
        maxx=next;
    if ((next+1)==sizee)
        return maxx; 
    return maxi(names,sizee,next+1,scores,maxx);
    //You need to return, else the function will be called but that
    // value wont be returned.
}