2017-09-05 45 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,它會產生一個,否則它會遞歸。如果不是我使用助手追加下一個值