斐波那契OCAML的N步代码

时间:2017-09-05 00:33:45

标签: algorithm ocaml fibonacci

所以我试图为我的类编写一些代码,它将输出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

但现在我被困在这里了。我知道我需要迭代并列出列表中的术语,但我不知道如何实现这一点。

我做了一个辅助函数和

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

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

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

  • 如果您来自命令性背景,请首先尝试一个命令式解决方案,例如打印结果的循环,而不是构建列表并立即绑定递归。您可以将所需状态存储在全局中,然后逐步更改以传递参数。
  • 以n = 2开头,使用元组而不是列表。首先,在使用列表之前手动扩展到固定的n = 3和固定的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=2n=3:对(a, b)(next, a)会发生什么?在列表方面它意味着什么?

通过遵循工作示例中的婴儿步骤,您应该能够找到解决方案。

答案 1 :(得分:0)

我已经使用许多辅助函数来解决它。

所以我做了一个求和函数,用来总结列表中的值 一个收集函数,只能从整个列表中取n个值

然后在我的原始函数中,我使用k的模式匹配,这样如果k = 1,它将产生一个,否则它会递归。如果不是,我使用帮助

添加下一个值