【发布时间】:2013-12-04 23:58:34
【问题描述】:
假设您正在编写一个尾递归循环函数来根据某些标准评估元素集合,并希望最终得到得分最高的元素及其得分。
您自然会将目前为止得分最高的元素及其得分作为参数传递给函数。
但是由于在递归开始时没有最佳元素,您最初应该将什么作为参数传递给循环函数?不想使用 null,您可以使用 Option[T] 作为参数类型,但是您必须在每次递归时检查 isEmpty,同时您知道它在初始调用后总是有一个值。没有更好的办法吗?
【问题讨论】:
-
你能做类似
( xs map ( x => (score(x),x) ) ).max的事情吗? -
这看起来不错,但一个缺点是您需要对集合进行两次迭代。
-
绝对!如果您的应用程序运行速度太慢并且分析显示此代码对问题有很大影响,那么您需要trade off maintainability for performance。在这种情况下,由 3 个参数(xs、hiScore 和 hiScorer)组成的尾递归解决方案几乎可以肯定是表现最好的,它可以让您按照 herman 的要求访问最高得分者及其得分。
-
我想我应该补充一点,如果
xs没有订购,或者如果比较它们非常昂贵(以上将比较它们的平局分数),你可以取最大值像这样的分数:( xs map ( x => (score(x),x) ) ).maxBy(_._1)