2017-10-31 4 views
0

私はOcamlには比較的新しく、Unfold関数を正しく理解していると思いますが、フィボナッチシーケンスを使ってフィボナッチシーケンスを作成する方法はわかりません。私たちは現在のものを見つけることができるように、最後の2つの値のホルダー変数を持つ必要はありませんか?すべての援助は非常に高く評価されます。私は参照のために以下のUnfold関数を追加しています。OcamlのUnfoldを使ったフィボナッチシーケンス

let rec unfold (f: 'seed -> ('a * 'seed)) (stop : 'b -> bool) (b :'seed) : 'a list = 
if stop b then [] 
else 
    let x, b' = f b in 
    x :: (unfold f stop b') 

答えて

2

最後の2つの値を格納して、次の値を作成するという正しい考えがありました。トリックはタプルにそれらを格納することです。

ジェネレータ関数はタプルをとり、生成された値として最初の数を返し、タプルと次のフィボナッチ数の第二の数の新しい状態を作成します。

fun (a, b) -> (a, (b, a+b)) 

停止機能は、単に取りますタプルし、いつ停止するかを決めます。

fun (a, b) -> a > 1000 

最初の状態は、最初の2つのフィボナッチ数である(0, 1)です。

すべて一緒にそれを置く:

# unfold (fun (a, b) -> (a, (b, a+b))) (fun (a, b) -> a > 1000) (0, 1);; 
- : int list = 
[0; 1; 1; 2; 3; 5; 8; 13; 21; 34; 55; 89; 144; 233; 377; 610; 987] 
+0

は/ダンケをありがとう! – ohhimark

関連する問題