F#递归函数在加号和减号之间交替

F# recursive function alternating between plus and minus

我被要求删除下面 F# 函数中的一个子句,同时保持其功能,即正负交替。

let rec altsum =
    function
    | [] -> 0
    | [ x ] -> x
    | x0 :: x1 :: xr -> x0 - x1 + altsum xr

我偶然发现了下面的解决方案,但我不太明白它是如何计算出正确结果的,因为它只包含一个减号而不包含一个加号。有人可以解释下面的函数 altsum1 是如何计算的吗?

let rec altsum1 =
    function
    | [] -> 0
    | x0 :: xr -> x0 - altsum1 xr

之所以有效,是因为 -1 * -1 = 1。然后我们可以使用分配式 属性 来证明:

a - (b - c) = a - b + c

所以:

altsum([1; 2; 3; 4]) =
1 - altsum([2; 3; 4]) =
1 - (2 - altsum([3; 4])) =
1 - (2 - (3 - altsum[4])) =
1 - (2 - (3 - 4)) =
1 - 2 + 3 - 4 =
-2