尾递归函数,用于计算数组中大于平均值的所有数字

时间:2016-11-15 13:19:59

标签: c++ recursion tail-recursion

我需要创建一个计算平均值的函数,返回大于平均值的值的数量。例如,传递{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);}

任何帮助将不胜感激。谢谢。

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

现在你的尾递归函数可以通过以下方式计算结果:

  1. 初始递归调用(或最后一次递归调用,取决于一个人的观点),将使用第一个构造函数,使用计算的平均值和第一个/最后一个值来构造result。数组:

    return result(TAvg(computed_average_goes_here, *acc));
    
  2. 剩余的尾递归调用变为:

    return result( TAvg( /* resursive parameters */), *acc);