Во-первых, давайте посмотрим на примеры вывода pell2
. Мы видим, что pell2
имеет единственный целочисленный параметр и возвращает список целых чисел. Итак, мы знаем, что функция, которую мы хотим создать, имеет следующую сигнатуру типа:
pell2: int -> int list
Исправление (некоторых, но не всех) синтаксических ошибок и попытка сохранить вашу логику,
let rec pell2 i =
if i=0 then []
else if i <= 2 then i
else if i>2 then pell2 i-1 + pell2 i-2
Обратите внимание, что я удалил точку с запятой в конце каждого выражения, так как OCaml использует точку с запятой в своем синтаксисе специально для работы с выражениями, оценивающими единицу измерения ()
. См. отличное объяснение ivg. Главный недостаток этого кода в том, что он не печатает проверку. Мы видим, что мы условно возвращаем список, а в противном случае возвращаем int
. Обратите внимание, как выше мы определили, что pell2 должен возвращать int list
. Итак, мы можем начать исправлять это, обернув наши результаты int
в список:
let rec pell2 n =
if n = 0 then []
else if n <= 2 then [n]
else ... something that will return the Pell number as a list ...
Как вы уже писали, ветку else
можно написать с помощью рекурсивных вызовов функции pell2. Однако мы не можем записать его так, как вы делали ранее, потому что pell2 оценивается как список, а бинарный оператор +
работает только с двумя целыми числами. Итак, нам нужно будет определить собственный способ суммирования списков. Назвав это sum_lists
, мы получим следующий код: Теперь мы можем полностью определить нашу функцию pell2:
let rec pell2 n =
if n = 0 then []
else if n <= 2 then [n]
else (* Pell(n) = (2 * Pell(n-1)) + Pell(n-2) *)
let half_of_first_term = pell2 n-1 in
let first_term = sum_lists half_of_first_term half_of_first_term in
let second_term = pell2 n-2 in
sum_lists first_term second_term
Итак, все, что осталось, — это определить sum_lists, чтобы мы правильно суммировали вместе два списка того же формата, что и возвращаемый тип pell2. Подпись для sum_lists будет
sum_lists: int list -> int list -> int list
Я дам базовую схему реализации, но оставлю остальное на ваше усмотрение, так как это основная проблема задачи назначения.
let sum_lists lst1 lst2 =
let rec sum_lists_helper lst1 lst2 carry =
match lst1, lst2 with
| [], [] -> if carry = 1 then [1] else []
| h::t, []
| [], h::t -> ...
| h1::t1, h2::t2 -> ...
in
sum_lists_helper lst1 lst2 0
person
EliKor
schedule
25.02.2021
->
? Откудаn
? - person Lhooq   schedule 25.02.2021