2017-09-05 43 views
0

所以我想为我的类编写一些代码,它会输出一个n阶斐波那契数列中第一个k项的int列表。斐波纳契OCAML的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号,以获得下一个值,但我就死在那,以及

谢谢提前!

+0

您尝试过什么,以完成该迭代?你在哪里存储你的数据?你是如何选择从数据结构中聚合哪些数据的? –

+0

我编写了一个帮助函数总和,它将总结给定列表中的值(我将在那里添加),但是我确定如何使这个有选择地加起来的最后n个数字为下一个值 – useroe

+0

我认为你需要显示更多的代码,是事情。我假设你有某种多值数据结构,那么你可以做一些N元素的添加?而且你不会让它永远增长,所以你要么使用类似队列的结构(LIFO),要么正在操纵一个固定数组并自己动手? –

回答

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)?在列表方面意味着什么?

通过遵循从一个工作示例的婴儿步骤,你应该能够工作到一个解决方案。

0

我已经想出了使用许多帮助函数。

所以我做了一个求和函数,将总结在表 上的参数值收集功能,将只取n个值从整个名单

,然后在我原来的功能,我使用模式如果k = 1,它会产生一个,否则它会递归。如果不是我使用助手追加下一个值