我有一个函数can_obtain
,以证明如果一个串init
可以转化为字符串target
与下列条件:递归函数停止处理的条件分支
- 串
init
和target
仅由字母“X”的和/或 “Y”(如 “XY”, “XXX”, “YYXY”, “Y” 等) - 串
target
比init
- 选择不再去
target
是- 串连 “X” 到
init
或 - 反向并连接 “Y” 到
init
- 串连 “X” 到
下面是函数,具有用于去除简洁琐碎的操作,如contains
reverse
和。
let can_obtain init target =
let final =
let rec reduce i text =
if i >= String.length target then text
else
let next =
let branchX = text^"X" in
let branchY = (reverse text)^"Y" in
if contains target branchX then branchX
else if contains target branchY then branchY
else text
in
reduce (i+1) next
in
reduce (String.length init) init
in
final = target
;;
问题是与这些转变它返回true
,这是正确
(* concat "X" only *)
(* "XY" -> "XYX" -> "XYXX" *)
can_obtain "XY" "XYXX";;
(* reverse and concat "Y" only *)
(* "XY" -> "YXY" -> "YXYY" -> "YXYYY" *)
can_obtain "XY" "YXYYY";;
(* reverse and concat "Y", then concat "X" lastly *)
(* "XY" -> "YXY" -> "YXYY" -> "YYXYY" -> "YYXYYX" *)
can_obtain "XY" "YYXYYX";;
但是,如果在过渡“X”的某一点是级联,则该函数将拒绝切换到反向分支,就回到false
:
(* concat "X", then tries to reverse then concat "Y" *)
(* "XY" -> "XYX" -> "XYXY" *)
can_obtain "XY" "XYXY";; (* false *)
我知道我在这里失去了只是一小部分,并且代码看起来真的太凌乱。我真的很感谢一些帮助。
你的代码是不是有效的OCaml程序。 – camlspotter
我哪里错了? @camlspotter – PieOhPah
至少大写字母的参数... –