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

Tail-recursive function to count all numbers larger than average in an array

本文关键字:平均值 数字 大于 递归函数 用于 计算 数组      更新时间:2023-10-16

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

任何帮助都会很感激。谢谢你。

一旦尾部递归函数计算出最终递归调用的平均值,并开始展开调用堆栈,因为它正在展开递归调用,现在它知道平均值是什么了。

它现在可以将平均值与每个元素进行比较,因为它展开了所有递归调用,并为每个高于计算平均值的元素增加一个计数器。

编辑:我想到了另一种实现更多尾部递归设计精神的方法。让函数返回一个类:

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