你的逻辑是错误的。它应该从i=1 到i=n/2 进行迭代(无论是通过循环、递归还是集合都无关紧要)。但按原样使用n 和当前i。
(1 to (n/2)).map(i => n + 1 - 2 * i).sum
您(或多或少)运行从i=1 到i=n(或者更确切地说是n 到1)的计算,但是您使用i/2 而不是n 而不是i,而是使用i/2+1 . (从 i=1 到 i=n 的 (n/2 + 1 - 2 * i) 的总和)。
// actually what you do is more like (1 to n).toList.reverse
// rather than (1 to n)
(1 to n).map(i => i/2 + 1 - 2 * (i/2 + 1)).sum
这是一个不同的公式。它有两倍的元素要求和,每个元素的一部分都在变化而不是保持不变,而另一部分的值错误。
要使用递归实现相同的逻辑,您必须执行以下操作:
// as one function with default args
// tail recursive version
def under(n: Int, i: Int = 1, sum: Int = 0): Int =
if (i > n/2) sum
else under(n, i+1, sum + (n + 2 - 2 * i))
// not tail recursive
def under(n: Int, i: Int = 1): Int =
if (i > n/2) 0
else (n + 2 - 2 * i) + under(n, i + 1)
// with nested functions without default args
def under(n: Int): Int = {
// tail recursive
def helper(i: Int, sum: Int): Int =
if (i > n/2) sum
else helper(i + 1, sum + (n + 2 - 2 * i))
helper(1, 0)
}
def under(n: Int): Int = {
// not tail recursive
def helper(i: Int): Int =
if (i > n/2) 0
else (n + 2 - 2 * i) + helper(i + 1)
helper(1)
}