我需要创建一个计算平均值的函数,返回大于平均值的值的数量。例如,传递{4,5,12,17}的数组应返回2(因为12和17大于平均值9.5)。到目前为止,我编写了函数来返回平均值,但是如何计算大于平均值的数字并保持尾递归?
int TAvg(int* a, int size, int acc=0, int num=0){ //acc is the sum so far, num is the number of all elements
if (size == 0){
return (acc / num);
}
return TAvg(a, size - 1, acc+a[size-1], num+1);}
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
一旦你的尾递归函数计算最终递归调用的平均值,并开始展开调用堆栈,当它展开递归调用时,它现在知道平均值是多少。
它现在可以比较每个元素的平均值,因为它展开所有递归调用,并且每个元素的增量计数器都高于计算的平均值。
编辑:我想到了另一种方法,它实现了更多的尾递归设计精神。让你的函数返回一个类:class result {
public:
int average;
int counter;
result(int average, int last_value) : average(average), counter(0)
{
if (last_value > average)
++counter;
}
result(const result &prev_result, int next_value) : average(prev_result.average), counter(prev_result.counter)
{
if (next_value > average)
++counter;
}
};
现在你的尾递归函数可以通过以下方式计算结果:
初始递归调用(或最后一次递归调用,取决于一个人的观点),将使用第一个构造函数,使用计算的平均值和第一个/最后一个值来构造result
。数组:
return result(TAvg(computed_average_goes_here, *acc));
剩余的尾递归调用变为:
return result( TAvg( /* resursive parameters */), *acc);