【发布时间】:2012-05-21 20:50:34
【问题描述】:
我是函数式编程的新手,所以使用函数式方法似乎更难解决一些问题。
假设我有一个数字列表,例如 1 到 10.000,并且我想获取列表中的项目,其总和最多为一个数字 n(比如说 100)。所以,它会得到这些数字,直到它们的总和大于 100。
在命令式编程中,解决这个问题很简单,因为我可以在每次交互中保留一个变量,一旦达到目标就停止。
但是我怎样才能在函数式编程中做同样的事情呢?由于 sum 函数对已完成的列表进行操作,而我仍然没有已完成的列表,我该如何“继续”计算?
如果 sum 是惰性计算的,我可以这样写:
(1 to 10000).sum.takeWhile(_ < 100)
P.S.:尽管任何答案都会受到赞赏,但我想要一个不会每次都计算总和的答案,因为显然命令式版本在速度方面会更加优化。
编辑:
我知道我可以将命令式循环方法“转换”为函数式递归函数。我更感兴趣的是找到一个现有的库函数是否可以提供一种方法,让我不必在每次需要时都编写一个。
【问题讨论】:
-
可能最容易使用变量累加器。
{ var sum = 0; (1 to 10000) takeWhile { i => sum += i; sum < 100 } }。在这里有var没有错;它无法逃脱,因为表达式周围有{}。 -
为什么你认为“每次你需要一些东西时”写一个函数比每次你需要一些东西时写一个命令式循环更不自然?
标签: scala functional-programming