#ocaml
#ocaml
Вопрос:
Я должен проверить, являются ли два списка анаграммами, я думаю, что я создал правильный код для этой задачи, но для этого нужна помощь
let rec ana l1 l2 =
if l1=[] amp;amp; l2=[] then true
else if List.hd l1 = List.hd l2 then ana (List.tl l1) l2
else if List.hd l1 != List.hd l2 then ana l1 (List.tl l2)
else false;;
ana [2;9;4;7] [2;4;7;9];;
Комментарии:
1. Эй, это не важно, добро пожаловать в SO! Это не отвечает на ваш вопрос, но я советую вам не использовать != для неравенства. Он может работать с целыми числами (случайно), но будет иметь очень причудливое поведение при других значениях. Правильный оператор неравенства
<>
.2. И поскольку у нас может не быть доступа к среде OCaml, и не все мы являемся mindreaders, вы также можете захотеть включить фактическое сообщение об ошибке. Помогите нам помочь вам и все такое, понимаете?
3. Ошибка исключения «hd»
Ответ №1:
Вы не обрабатываете случай, когда один или другой список пуст, только когда оба. Поэтому, когда вы доберетесь до else if List.hd l1 = List.hd l2
, когда либо l1
или l2
пусто, List.hd
вызовет исключение, поскольку оно не определено для пустых списков.
Возможно, вы захотите использовать сопоставление с образцом вместо этого, что позволило бы избежать этого и предупредить вас о любых пропущенных случаях. Вот ваш код, переписанный с использованием сопоставления с образцом. Он по-прежнему не делает то, что вы хотите, но, по крайней мере, не вызывает исключения:
let rec ana l1 l2 =
match l1, l2 with
| [], [] ->
true
| h1::t1, h2::t2 ->
if h1 = h2 then
ana t1 l2
else
ana l1 t2
| _ ->
false