Последовательность Фибоначчи с Развернуть в Окамле
Я относительно новичок в 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]