Ocaml 我怎样才能勾选“两个”;“指针”;在浏览列表时彼此见面?

Ocaml 我怎样才能勾选“两个”;“指针”;在浏览列表时彼此见面?,ocaml,Ocaml,例如,我有一个列表[1;2;1;3;2;4;1;5;6;8;…]。列表中有重复的元素 然后,我们通过两个虚拟指针浏览列表 一个指针a从开头开始,速度为2 另一个指针 b>代码>从列表中间的某个地方开始,其速度为 1 >代码> < /p> 那么如何检查a是否与b会面 例如: a从[1;2;1;3;2;4;1;5;6;8;开始] b从索引1开始,即[2;1;3;2;4;1;5;6;8;…] 因此,在一次移动之后,a和b将到达索引2,并且它们相遇 如何仅通过元素检查是否满足要求,而不使用索引信息 我

例如,我有一个列表
[1;2;1;3;2;4;1;5;6;8;…]
。列表中有重复的元素

然后,我们通过两个虚拟指针浏览列表

一个指针
a
从开头开始,速度为
2

另一个指针<代码> b>代码>从列表中间的某个地方开始,其速度为<代码> 1 >代码> < /p> 那么如何检查

a
是否与
b
会面


例如:

a
[1;2;1;3;2;4;1;5;6;8;开始]

b
从索引
1
开始,即
[2;1;3;2;4;1;5;6;8;…]

因此,在一次移动之后,
a
b
将到达索引
2
,并且它们相遇

如何仅通过元素检查是否满足要求,而不使用索引信息

我们可以比较这两个元素的值,因为里面可能有重复项


就守则而言:

let l = [1; 2; 1; 3; 2; 4; 1; 5; 6; 8;...]

let find_middle_start l n = 
  let rec aux i = function
    | [] -> []
    | _::tl when i >= n -> tl
    | _::tl -> aux (i+1) tl
  in
  aux 0 l

let parallel_travel l =
  Random.self_init();
  let b_start = find_middle_start l (Random.int (List.length l)) in
  let rec go = function
    | [], _::_ | _::_, [] | _::[], _::_ -> print_endline "Never meet"
    | x::x1::xs, y::ys ->
      if check_meet x y then print_endline "Meet"
      else go xs ys
  in
  go l b_start

我如何执行
check\u meet
?我不能只做
x==y
对吗?

绑定列表,并按标识(与
=
进行比较)

请注意,如果您试图确定一个列表是否与另一个列表共享尾部,此方法是不够的(慢速指针可以在快速指针追上它之前到达末尾)。

绑定列表,并按标识进行比较(使用
=

请注意,如果您试图确定一个列表是否与另一个列表共享尾部,此方法是不够的(慢速指针可以在快速指针追上它之前到达末尾)。

绑定列表,并按标识进行比较(使用
=

请注意,如果您试图确定一个列表是否与另一个列表共享尾部,此方法是不够的(慢速指针可以在快速指针追上它之前到达末尾)。

绑定列表,并按标识进行比较(使用
=



请注意,如果您试图确定一个列表是否与另一个列表共享尾部,此方法是不够的(慢速指针可以在快速指针追上它之前到达末尾)。

但是
==
可以信任吗?它只是比较pysical地址吗?还是内部的所有值?对于不可变类型,其含义取决于实现。因此,在我看来,它在这里不是严格可用的。我承认这有点松懈,但没有真正的选择(除了“你不应该那样做”这一有点令人不满意的立场。)@JeffreyScofield你能再解释一下吗?你可以在这里阅读我对物理平等的看法:但是
=
可以信任吗?它只是比较pysical地址吗?还是内部的所有值?对于不可变类型,其含义取决于实现。因此,在我看来,它在这里不是严格可用的。我承认这有点松懈,但没有真正的选择(除了“你不应该那样做”这一有点令人不满意的立场。)@JeffreyScofield你能再解释一下吗?你可以在这里阅读我对物理平等的看法:但是
=
可以信任吗?它只是比较pysical地址吗?还是内部的所有值?对于不可变类型,其含义取决于实现。因此,在我看来,它在这里不是严格可用的。我承认这有点松懈,但没有真正的选择(除了“你不应该那样做”这一有点令人不满意的立场。)@JeffreyScofield你能再解释一下吗?你可以在这里阅读我对物理平等的看法:但是
=
可以信任吗?它只是比较pysical地址吗?还是内部的所有值?对于不可变类型,其含义取决于实现。因此,在我看来,它在这里不是严格可用的。我承认这有点松懈,但没有真正的选择(除了“你不应该那样做”这一有点令人不满意的立场之外)。@JeffreyScofield你能再解释一下吗?你可以在这里阅读我对身体平等的看法:
| ((_::_::xs) as a)), ((_::ys) as b) ->
  if a == b then ...
  else ...