从3到2个子句简化递归函数

app*_*ano 1 recursion f#

我在F#上做一些练习,我有这个函数来计算替代总和:

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

val altsum : int list -> int
Run Code Online (Sandbox Code Playgroud)

练习包括声明相同的功能只有两个条款......但是如何做到这一点?

app*_*ano 6

mydogisbox的答案是正确的并且有效!

但经过一些尝试后,我发现了一个最小且可读的问题解决方案.

let rec altsum2 = function
| [] -> 0
| x0::xs -> x0 - altsum2 xs
Run Code Online (Sandbox Code Playgroud)

altsum2 [1;2;3] essentially do this:
1 - (2 - (3 - 0)
Run Code Online (Sandbox Code Playgroud)

它有点棘手,但工作!


无关:

使用F#List库解决问题的另一种优雅方法是:

let altsum3 list = List.foldBack (fun x acc -> x - acc) list 0;;
Run Code Online (Sandbox Code Playgroud)

在phoog的评论后,我开始尝试使用尾递归函数来解决问题:

let tail_altsum4 list = 
    let pl l = List.length l % 2 = 0
    let rec rt = function    
        | ([],acc) -> if pl list then -acc else acc
        | (x0::xs,acc) -> rt (xs, x0 - acc)
    rt (list,0)
Run Code Online (Sandbox Code Playgroud)

这也有点棘手......减法不是可交换的,并且不可能想到用List.rev长列表来反转......但我找到了一个解决方法!:)

  • 一直这样:`让altsum3 list = List.foldBack( - )list 0 ;;`. (2认同)