Я изучаю OCaml и теперь застрял с кодом. Это код, который составляет список доступных узлов из графика.
type graph = (vertex * vertex) list
and vertex = int
let rec sort lst =
match lst with
[] -> []
| h::t -> insert h (sort t)
and insert n lst =
match lst with
[] -> [n]
| h::t -> if n <= h then n :: lst else h :: insert n t;;
let rec remove lst =
match lst with
| [] -> []
| x::[] -> x::[]
| x::y::tl ->
if x=y then remove (y::tl)
else x::remove (y::tl);;
let rec reach : graph * vertex -> vertex list
= fun (g, v) ->
match g with
|[] -> []
|h::t ->let x = [] in
match h with
|a,b -> if a = v then remove(sort(v::x) @ (reach (g, b)))
else
remove(sort(v::reach (t, v)));;
reach([(1,2);(2,3);(3,4);(4,2);(2,5)],4);;
Я думаю, что мой код бессмысленно сложен из-за отсутствия у меня возможности кодирования. Кроме того, главная проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу заставить рекурсивную функцию «достигать» доступа с исходным списком «g», поскольку она становится рекурсивной в другом состоянии, поскольку она обращается со списком «t».
trace говорит
reach <-- ([(1, 2); (2, 3); (3, 4); (4, 2); (2, 5)], 4)
reach <-- ([(2, 3); (3, 4); (4, 2); (2, 5)], 4)
reach <-- ([(3, 4); (4, 2); (2, 5)], 4)
reach <-- ([(4, 2); (2, 5)], 4)
reach <-- ([(4, 2); (2, 5)], 2)
reach <-- ([(2, 5)], 2)
reach <-- ([(2, 5)], 5)
reach <-- ([], 5)
reach --> []
reach --> [5]
reach --> [2; 5]
reach --> [2; 5]
reach --> [4; 2; 5]
reach --> [2; 4; 5]
reach --> [2; 4; 5]
reach --> [2; 4; 5]
- : vertex list = [2; 4; 5]
Сначала я запросил новую переменную с let y = g и изменил код
|a,b -> if a = v then remove(sort(v::x) @ (reach (y, b)))
else
remove(sort(v::reach (t, v)));;
, так как полагал, что дубликаты будут удаленыс помощью функции «удалить» и внутренняя функция получит доступ к списку y, а не к t, который потерял свою голову. Однако все пошло не так, как я планировал. Это все еще дает мне тот же результат. Чтобы сделать доступ к функции с исходным списком «g» в другом состоянии, что мне делать ...?
reach <-- ([(1, 2); (2, 3); (3, 4); (4, 2); (2, 5)], 4)
reach <-- ([(2, 3); (3, 4); (4, 2); (2, 5)], 4)
reach <-- ([(3, 4); (4, 2); (2, 5)], 4)
reach <-- ([(4, 2); (2, 5)], 4)
reach <-- ([(1, 2); (2, 3); (3, 4); (4, 2); (2, 5)], 2)
(*I want function goes back to original list as the variable changes like above*)