斐波那契 OCAML 的 N 步代码

N-step code for fibonacci OCAML

所以我正在尝试为我的 class 编写一些代码,它将输出 n 步斐波那契数列中前 k 项的 int 列表。

所以对于那些不知道的人来说,n 步斐波那契数列是当您在它之前添加 n 个数字以获得下一个数字时,

so for n=1 it'd be 1,1,1,1,1,...
n=2, it'd be 1,1,2,3,5,...
n=3 it'd be 1,1,2,4,7...

我的方法是从一个基本案例开始,所以

let rec n_step n k= 

if k=1 then [1] else 

if n=1 then 1::nacci n k-1 else

但现在我被困在这里了。我知道我需要遍历并添加列表中的术语,但我不确定如何完成此操作。

我做了一个辅助函数sum

let rec sum lst =
  match lst with
  | [] ->  0
  | h::t -> h + sum t

我试图让它有选择地添加列表的最后 n 个数字以获得下一个值,但我也被卡住了

提前致谢!

这是作业,所以我只建议一些步骤,而不是完整的解决方案:

  • 如果您来自命令式背景,请首先尝试命令式解决方案,例如打印结果的循环,而不是立即构建列表和绑定递归。您可以将所需状态存储在全局中,然后逐渐更改它以传递参数。
  • 从 n=2 开始,使用元组而不是列表。首先这样做会容易得多,在使用列表之前手动扩展到 fixed n=3 和 fixed n=4。

应用这两条建议,第一步可能是:

let print_fib_2 () =
  let previous_ref = ref (1, 1) in
  for i = 0 to 10 do
    let (a, b) = !previous_ref in
    let next = a + b in
    previous_ref := (next, a);
    Printf.printf "%d\n" next
  done

我首先概括为使用将 n=2 更改为 n=3(a, b)(next, a) 这对会发生什么?列表是什么意思?

按照工作示例中的小步骤,您应该能够找到解决方案。

我已经使用许多辅助函数解决了这个问题。

所以我制作了一个求和函数,可以对列表中的值求和 一个 gather 函数,它只会从整个列表中获取 n 个值

然后在我原来的函数中,我对 k 使用了模式匹配,如果 k=1,它会产生一个,否则它会递归。如果不是,我使用 helper

附加下一个值