Почему этот код не работает рекурсивная функция выдает ошибку

#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