0

我对 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')
4

1 回答 1

2

您有存储最后两个值以创建下一个值的正确想法。诀窍是将它们存储在一个元组中。

生成器函数接受元组,返回第一个数字作为生成值,并使用元组的第二个数字和下一个斐波那契数创建一个新状态:

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

stop 函数只接受元组并决定何时停止,例如

fun (a, b) -> a > 1000

第一个状态是(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]
于 2017-10-31T01:23:15.303 回答