尾递归函数,用于计算数组中大于平均值的所有数字
Tail-recursive function to count all numbers larger than average in an array
我需要创建一个函数来计算平均值,并且返回大于平均值的值的个数。例如,传递一个数组{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;
}
};
现在你的尾递归函数可以计算结果:
初始递归调用(或最后递归调用,取决于你的观点)将通过使用第一个构造函数,使用计算平均值和数组中的第一个/最后一个值来构造
result
:return result(TAvg(computed_average_goes_here, *acc));
剩余的尾部递归调用变成:
return result( TAvg( /* resursive parameters */), *acc);
相关文章:
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 玩数字编程挑战(子数组的平均值)
- 如何让我的代码显示文件名不正确或文件中数字的平均值?
- 查找数组最后 3 个数字的平均值
- 如何计算和显示C++中5个数字的平均值?
- 从文件的一行中查找数字的平均值,避免使用第一个单词
- C++ 如何对一串数字求平均值
- 在此任务上遇到麻烦,我们需要使用指针和数组来找到文本文件中某些数字的平均值,中值和模式
- 我必须将 5 个数字放入一个数组中,而不是 cin 计算平均值并输出它,我做错了
- 如何使用不同的功能计算三个数字的总和,平均值和产物
- 我需要在给定数字中找到与平均值的最接近(和次要)数字
- 如何在数组中的范围内添加所有数字?然后找到该范围的平均值
- 用O(1)表示法求一系列数字的平均值——常数时间
- 整流波形(数字阵列)的平均值、RMS和过零次数c++
- C++计算2D数组中可变宽度数字的平均值
- 从文件中读取第11列数字并求平均值?(c++)
- 从文本中读取数字并输出平均值
- C++,计算正数和负数并计算数字的平均值)编写一个读取未指定数量的整数的程序
- 如何在 c++ 中获取最接近平均值的数字