避免循环

时间:2014-12-04 23:51:30

标签: algorithm

严格来说,这不是编码问题,因为我负责电子表格而不是代码,但适用相同的原则。

我正在尝试创建一个“平均预测器”的电子表格。举个例子:比如说一个击球手从40局平均得到24分(换句话说,得分为960分)。如果他从这里开始平均每场比赛平均40次,那么他将职业生涯平均值提高到30分需要多少局?

手动处理这个例子非常容易,并且使用while循环解决一般问题也很容易。但是,如上所述,我不能使用循环。有什么想法或建议吗?

2 个答案:

答案 0 :(得分:2)

为此目的,您不需要循环。您可以使用以下公式(moving average)来解决它:

(current_avg * current_innings + avg * x)/(current_innings + x) = goal_avg

你必须解决x的等式。

您在Wolfram Alpha上计算的示例:

输入:(24 * 40 + 40 * x)/(40 + x) = 30 solve x 结果:x=24

Link

答案 1 :(得分:0)

正如@StriplingWarrior在对该问题的评论中所建议的那样,写出一般方程,用代数方法求解,并在电子表格中使用得到的公式。原始等式在@trylimits的先前答案中给出。我使用稍微不同的标识符来表示问题的对称性:

(old_avg * old_innings + new_avg * new_innings)/(old_innings + new_innings) 
              = goal_avg
old_avg * old_innings + new_avg * new_innings 
              = goal_avg * (old_innings + new_innings)
old_avg * old_innings + new_avg * new_innings 
              = goal_avg * old_innings + goal_avg * new_innings
new_avg * new_innings - goal_avg *  new_innings
              = goal_avg * old_innings - old_avg * old_innings
new_innings * (new_avg - goal_avg) = old_innings * (goal_avg - old_avg)

如果new_avg - goal_avg为零,除非goal_avg - old_avg也为零,否则没有解决方案,在这种情况下,不需要进行任何更改,new_innings可以为零。如果new_avg - goal_avg非零:

new_innings = old_innings * (goal_avg - old_avg) / (new_avg - goal_avg)

此等式的右侧是您可以放入电子表格的公式。

示例中的值为:

old_avg = 24
old_innings = 40
new_avg = 40
goal_avg = 30

new_innings = 40 * (30 - 24) / (40 - 30)
            = 240 / 10 
            = 24