生成两个值(OCaml或其他语言)之间给定长度的所有列表
我是ocaml新手,试图编写一些代码来生成两个值之间的所有数字列表 例如,如果我调用此函数生成两个值(OCaml或其他语言)之间给定长度的所有列表,ocaml,Ocaml,我是ocaml新手,试图编写一些代码来生成两个值之间的所有数字列表 例如,如果我调用此函数generate,我希望获得如下内容: let generate ~min ~max ~length (* Maybe other arguments *) = (* The code *) ;; generate ~min:0 ~max:3 ~length:4;; open Core.Std;; type next_list = | Complete of int list
generate
,我希望获得如下内容:
let generate ~min ~max ~length (* Maybe other arguments *) =
(* The code *)
;;
generate ~min:0 ~max:3 ~length:4;;
open Core.Std;;
type next_list =
| Complete of int list
| Partial of int list
| Result of (int array) list
;;
let rec next ~r ~min ~max ~l =
let detox = function | Partial a -> a | _ -> assert false in
match l with
| Partial (hd :: tl) when hd <= max -> Partial (hd + 1 :: tl)
| Partial (hd :: tl) when hd = max + 1 -> next ~r ~min ~max
~l:(Partial (min :: (detox (next ~r ~min ~max ~l:(Partial tl))) ))
| Complete (hd :: tl) when hd <= max -> next ~r:([l] :: r) ~min ~max
~l:(Complete (hd + 1 :: tl))
| Complete (hd :: tl) when hd = max + 1 -> next ~r ~min ~max
~l:(Complete (min :: (detox (next ~r ~min ~max ~l:(Partial tl)))))
(*| Partial [] -> next ~r ~min ~max ~l:(Result r)*)
| Result a -> Result a
应该回来
[
[0;0;0];
[1;0;0];
[2;0;0];
[3;0;0];
[0;1;0];
以此类推
[3;2;3];
[0;3;3];
[1;3;3];
[2;3;3];
[3;3;3];
]
我已经尝试过这样的代码:
let generate ~min ~max ~length (* Maybe other arguments *) =
(* The code *)
;;
generate ~min:0 ~max:3 ~length:4;;
open Core.Std;;
type next_list =
| Complete of int list
| Partial of int list
| Result of (int array) list
;;
let rec next ~r ~min ~max ~l =
let detox = function | Partial a -> a | _ -> assert false in
match l with
| Partial (hd :: tl) when hd <= max -> Partial (hd + 1 :: tl)
| Partial (hd :: tl) when hd = max + 1 -> next ~r ~min ~max
~l:(Partial (min :: (detox (next ~r ~min ~max ~l:(Partial tl))) ))
| Complete (hd :: tl) when hd <= max -> next ~r:([l] :: r) ~min ~max
~l:(Complete (hd + 1 :: tl))
| Complete (hd :: tl) when hd = max + 1 -> next ~r ~min ~max
~l:(Complete (min :: (detox (next ~r ~min ~max ~l:(Partial tl)))))
(*| Partial [] -> next ~r ~min ~max ~l:(Result r)*)
| Result a -> Result a
opencore.Std;;
键入下一个列表=
|完整的整数列表
|整数列表的部分
|(int数组)列表的结果
;;
让rec下一个~r~最小~max~l=
让detoxin=函数|部分a->a | |->在中断言false
匹配
|部分(hd::tl)当hd部分(hd+1::tl)时
|当hd=max+1->next~r~min~max时部分(hd::tl)
~l:(部分(最小::(解毒(下一个~r~min~max~l:(部分tl)))
|当hd下一个~r:([l]::r)~min~max时完成(hd::tl)
~l:(完成(hd+1::tl))
|当hd=max+1->next~r~min~max时完成(hd::tl)
~l:(完成(最小值::(排毒(下一个~r~min~max~l:(部分tl ')))
(*|部分[]->next~r~min~max~l:(结果r)*)
|结果a->结果a
如有必要,它可以分布在多个功能中,这不是问题。我还对非ocaml代码或想法感兴趣 谢谢你的帮助 这是我关于Stackoverflow的第一个问题,如果我的问题不清楚,请毫不犹豫地回答。这里有一个提示:
let count_prefix low high lists =
???
let generate min max length =
let rec recur low high len =
if len = 0 then []
else count_prefix low high (recur low high (len - 1)) in
recur min max length
count\u prefix
应返回一个列表,该列表是列表的元素
前缀为低
到高
。如果列表
为空,则应将包含编号低
的列表返回到高
。即:
count_prefix 0 3 [] => [[0]; [1]; [2]]
count_prefix 0 3 [[10];[20]] => [[0; 10]; [0; 20]; [1; 10]; [1; 20]; [2; 10]; [2; 20]]
填写count\u前缀的定义
这里有一些解决方案:
首先,让我们定义以2个列表l1和l2作为输入,并生成一个列表列表,其中每个元素的l2由l1的1个元素扩充:
let enumerate l ll = List.fold ~init:[] ~f:(fun op x -> (x::ll)::op) l;;
列举[0;1;2;3][4;5;6];;
-:int list=[3;4;5;6];[2;4;5;6];[1;4;5;6];[0;4;5;6]]
现在生成:
let rec generate length ll =
if length=1 then List.fold ~init:[] ~f:(fun op x -> [x]::op) ll
else
let result = generate (length-1) ll in
List.fold ~init:[] ~f:(fun op x -> (enumerate ll x)@op) result;;
用法如下:
generate 2 [1;2;3];; (* instead of generate ~min:1 ~max:3 ~length:2 *)
一些解释:
List.fold~init:[]~f:(乐趣op x->[x]::op)ll
=>这将创建列表的初始列表(单例)
第二个:获取每个长度为-1的列表并执行枚举。我尝试了几个递归函数,将head增加到max,然后从尾部添加下一个列表。