Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从数组元素创建列表,生成数字序列_Arrays_Algorithm_Ocaml - Fatal编程技术网

Arrays 从数组元素创建列表,生成数字序列

Arrays 从数组元素创建列表,生成数字序列,arrays,algorithm,ocaml,Arrays,Algorithm,Ocaml,问题是: 我有像(例如)333322111这样的数字。我需要写一个程序来检查是否有可能在相同的数字彼此不相邻的情况下进行排序。唯一的条件是第一个和最后一个元素是已知的。在本例中,让我们将其设为2和3。正确的顺序可能是2 32131 3 我的想法是将中间元素的计数放入数组[|3;2;3 |],通过while循环创建列表(一种方法用于升序,另一种方法用于降序),添加第一个和最后一个元素,然后检查序列是否正确。主方法中有几个选项-descengind、升序、还原等 这里有一些代码 let makeUp

问题是: 我有像(例如)333322111这样的数字。我需要写一个程序来检查是否有可能在相同的数字彼此不相邻的情况下进行排序。唯一的条件是第一个和最后一个元素是已知的。在本例中,让我们将其设为2和3。正确的顺序可能是2 32131 3

我的想法是将中间元素的计数放入数组[|3;2;3 |],通过while循环创建列表(一种方法用于升序,另一种方法用于降序),添加第一个和最后一个元素,然后检查序列是否正确。主方法中有几个选项-descengind、升序、还原等

这里有一些代码

let makeUp b e arr k= 
  let l = ref [] in
  let i = ref 0 in
  while (List.length !l<k) do
    if arr.(!i) > 0 then l := !i+1 :: !l ; arr.(!i) <- arr.(!i) -1;
    i := (!i + 1) mod Array.length arr; 
  done;
  [b]@(List.rev !l)@[e];;

let rec isCorrect lista =
  match lista with
    [] -> true
  |h::[] -> true
  |h::t -> if (h = List.hd t)then false
    else isCorrect t;;

这根本行不通。我根本不知道如何解决这项任务

好的,特别是要解决您的问题,您可以使用
Array.copy
,它将创建数组的新副本,如下所示:

let find b e array length = 
  if isCorrect(makeUp b e array length) then makeUp b e array length
  else if isCorrect.....
  else [0]
let makeUp b e arr k =
  let arr = Array.copy arr in
  ...
另外,尽量不要这么急迫,用更实用的风格编写代码。不要使用while循环,而是使用递归(或联合递归)来构建东西

例如,这是对while循环代码的机械转换(我没有试图理解您的算法),以实现更强大的功能:

let make b e arr k =
  let arr = Array.copy arr in
  let rec loop xs i len =
    let j = (i + 1) mod Array.length arr in
    if i = k then List.rev (e::xs)
    else if arr.(i) > 0
    then
      let () = arr.(i) <- arr.(i) - 1 in
      loop (i + 1 :: xs) j (len + 1)
    else loop xs j len in
  loop [b] 1 1

如果列表按每个元素集的基数降序排列,那么不能继续在倒金字塔中穿插吗

如果一个元素出现的数量(+1)大于所有其他元素的总和,那么不能创建这样一个序列的情况不是唯一的吗

3333 222 111

3 3 3 3
 2 2 2
1 1 1


33333333 222 111

3 3 3 3 3 3 3 3
 2 2 2 1 1 1 x

好的,谢谢你的编辑,这是一个示例代码,用来说明我的意思,但你是对的。一个程序追溯分析解的步骤会被认为是可以接受的吗?我不太确定你的意思:)英语不是我的第一语言,我想我遗漏了一些东西,抱歉,我想,复制可能是一种方式。我知道我应该使用递归。我是OCAML的新手(新程序员),我发现很难在一瞬间编写C++,几秒钟后就可以思考。关于我对if表达式的理解,你是对的。你能告诉我,我应该怎么做才能得到我期望的结果吗?我不能,因为我不知道你想要什么;)我想要的是
如果arr.(!I)>0那么{l:=!I+1::!l;arr.(!I)啊,更新了post.OCaml使用
开始/结束
或者仅仅
()
(括号)。谢谢,程序准备好了。我的意思是,它正在工作,稍后我应该更改我的循环,以实现您所说的功能。关闭。丢失的
第一个和最后一个元素是已知的
(固定的,预设的)我现在做的是3,2-开始和结束3333 222 111-所有元素| |下降:3 2132113 2正确上升:3 12312313 2正确还原的结束描述:2 13213213 3不正确(如果正确将被反转)还原的结束asc:…我必须先打印正确,否则我应该打印[o]@灰胡子哦,对了;我确实错过了。但是基本前提没有太大改变,是吗?
基本前提没有太大改变
-这就是为什么我首先评论了
关闭
,或者关于
分析解
。修复/预放置元素会增加约束,并且可以通过特殊的大小写来处理(最常见的元素或不是)-没有什么启发性的想法掠过我的脑海。
if arr.(!i) > 0 then
  l := !i+1 :: !l;
arr.(!i) <- arr.(!i) - 1;
i := (!i + 1) mod Array.length arr;
if arr.(!i) > 0 then begin
   l := !i+1 :: !l;
   arr.(!i) <- arr.(!i) - 1;
end;
i := (!i + 1) mod Array.length arr;
3333 222 111

3 3 3 3
 2 2 2
1 1 1


33333333 222 111

3 3 3 3 3 3 3 3
 2 2 2 1 1 1 x