Functional programming 在不使用辅助函数(如fold_left)的情况下编写函数

Functional programming 在不使用辅助函数(如fold_left)的情况下编写函数,functional-programming,ocaml,Functional Programming,Ocaml,我还没有学习List.fold_left或List.rev,但上面的代码解决了我的任务,即:编写一个 let rec ddr l = let (r,_) = List.fold_left (fun (a_l, a_i) x -> ((a_i + x) :: a_l , a_i+x)) ([],0) l in List.rev r 这看起来像是我这学期教的课程中的家庭作业问题!所以我不会给出解决方案,但我会给你一个提示 假设您正在处理一个列表[1

我还没有学习List.fold_left或List.rev,但上面的代码解决了我的任务,即:编写一个

let rec ddr l =
  let (r,_) =
    List.fold_left (fun (a_l, a_i) x ->
        ((a_i + x) :: a_l , a_i+x))
      ([],0) l in
  List.rev r

这看起来像是我这学期教的课程中的家庭作业问题!所以我不会给出解决方案,但我会给你一个提示


假设您正在处理一个列表[1;2;3;4],并且已经到达了3。如果只知道前面元素的部分和是什么,那么计算新的部分和就很容易了。尝试找到一种方法来携带部分和到目前为止,可能是通过使用辅助函数。

如果给递归函数第二个累加器参数,可能最简单。你能写一个递归函数,它接受一个列表并返回另一个列表,每个值递增一个吗?如果是,请告诉我们-这段代码是一个好的开始。@Bergi是的,我想我可以写它。我在朋友的帮助下编写了递归累积版本,但我仍然不理解它。你介意给我看一下我上传的代码的非累积版本吗?如果你不介意的话,还可以解释这两种情况??你可以通过省略|[x]->[sx+x]行来简化。试着去理解为什么其他的情况已经足够了,以及它们将如何处理一个元素列表。你的朋友是如何得出这个解决方案的,也许他可以解释一下?你所说的代码的非累积版本是什么意思?
  [1;2;3] -> [1; 3; 6]
  [4, 5] -> [4; 9]