2014-12-04 323 views
-2

这不是严格意义上的编码问题,因为我负责电子表格而不是代码,但应用了相同的原则。避免while循环

我试图创建一个“平均预测器”的电子表格。举个例子:说一个击球手从40局平均得到24分(换句话说,已经得到960分)。如果他从现在起每场比赛平均执行40次,那么他需要多少局才能将自己的职业生涯平均提高到30?

用手工处理这个例子非常容易,并且就像用while循环解决一般问题一样简单。但是,如前所述,我不能使用循环。任何想法或建议?

+3

使用代数开发一种通式,然后写对应于式代码。 – StriplingWarrior 2014-12-05 00:01:21

+1

这个问题似乎是题外话题,因为它是关于解决数学问题 – AakashM 2014-12-05 10:52:35

回答

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

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