为什么找不到我在 HashTable 中的条目?

Why is my entry in the HashTable not found?

我有以下代码:

let to_permutation pairs max_el =
  let tbl = Hashtbl.create 100 in
  let rec aux i collector = 
    if i > max_el then collector
    else 
      match Hashtbl.find_opt tbl i with
        None ->   
          ignore (Printf.printf "NOT found \n");
          Hashtbl.add tbl i 1;
          aux (i + 1) (List.append (List.hd collector) [List.assoc i pairs] :: List.tl collector)           
      | Some _ ->
          ignore (Printf.printf "Found\n");
          aux (i + 1) (List.append [[]] collector)  
  in
  aux 1 [[]];;

它应该做什么:当我给函数一个成对列表时,我希望它为我生成映射整数的循环(基于成对。)

示例:to_permutation [(1, 6); (2, 3); (3, 5); (4, 1); (5, 2); (6, 4)] 6;; 应该 return 类似于 [[1; 6; 4]; [2; 3; 5]];

但是我什至没有接近这个,因为检查我是否已经访问过一个元素(并因此检测到一个循环)的查找失败了。程序输出:

to_permutation [(1, 6); (2, 3); (3, 5); (4, 1); (5, 2); (6, 4)] 6;;
NOT found 
NOT found 
NOT found 
NOT found 
NOT found 
NOT found 
- : int list list = [[6; 3; 5; 1; 2; 4]]

尽管我插入到散列 table 中,但它从未找到任何元素。我做错了什么?

通过调用 aux i,您维护了 table tbl 仅包含严格低于 i 的键的不变性。因此 find_opt tbl i 始终 return None,并且在调用 aux (i+1) 之前将 i 键添加到 tbl 以保留前面所述的不变量。