Последовательность Фибоначчи с Развернуть в Окамле

Я относительно новичок в Ocaml и думаю, что правильно понимаю функцию Развернуть, но просто не понимаю, как сделать последовательность Фибоначчи, используя ее. Разве нам не нужна переменная-держатель последних двух значений, чтобы мы могли найти текущее? Вся помощь очень ценится. Я добавляю функцию Развернуть ниже для справки.

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')

1 ответ

У вас была правильная идея сохранить два последних значения для создания следующего. Хитрость заключается в том, чтобы хранить их в кортеже.

Функция генератора принимает кортеж, возвращает первое число как сгенерированное значение и создает новое состояние со вторым номером кортежа и следующим числом Фибоначчи:

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

Функция остановки просто берет кортеж и решает, когда остановиться, например

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]
Другие вопросы по тегам