更新:我不能使用任何 List.function 的东西。
我是 OCaml 的新手,我正在学习这门课程,我应该从值列表中计算出非递减值的列表。
因此,例如,我有一个列表 [1; 2;3;1个;2;7; 6]
因此,接受列表的函数 mono 返回以下内容:
# mono [1; 2; 3; 1; 2; 7; 6];;
- : int list = [1; 2; 3; 7]
我执行以下操作:
let rec calculateCheck value lst = (
match lst with
[] -> true
| x :: xs -> (
if (value < x) then
false
else
calculateCheck value xs
)
);;
let rec reverse_list lst = (
match lst with
[] -> []
| x :: xs -> (
reverse_list xs @ [x]
)
);;
let shouldReverse = ref 1;;
let cancelReverse somelist lst = (
shouldReverse := 0;
reverse_list lst
);;
let rec mono lst = (
let somelist = ref lst in
if (!shouldReverse = 1) then
somelist := cancelReverse somelist lst
else
somelist := lst;
match !somelist with
[] -> []
| x :: xs -> (
if (calculateCheck x xs) then
[x] @ mono xs
else
[] @ mono xs
);
);;
问题?
- 由于 shouldReverse,这只适用于一次。
- 我无法反转价值;
mono list
应该返回非递减列表。
问题?
- 有什么简单的方法可以做到这一点?
- 具体如何获取列表的子集。例如对于 [1; 2;3;5个;6],我想要[1; 2;3] 作为 5 的输出,以便我可以递归地解决这个问题。另一件事是,您可以将列表设为 [1; 2;3;5个;6;5]:: 所以对于第二个 5,输出应该是 [1; 2;3;5个;6]。
有任何想法吗?
谢谢