我在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)
练习包括声明相同的功能只有两个条款......但是如何做到这一点?
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长列表来反转......但我找到了一个解决方法!:)