我已经使用此函数来查找最大元素 它适用于某些情况,但在其他情况下它出错了,这就是我用函数调用函数的情况。
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);
}
答案 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)
你的功能有几处错误。
该行
else if (scores[prev]<scores[next])maxx=next;
需要
else if (scores[maxx]<scores[next])maxx=next;
// ^^^^
您在递归调用中缺少return
。而不是
else maxi(names,sizee,prev+1,next+1,scores,maxx);
它需要
else
return maxi(names,sizee,prev+1,next+1,scores,maxx);
此外,该功能可以简化。
name
。它可以删除。prev
也可以删除。if-else-else
语句。这是一个简化版本。
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.
}