我有一個函數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
至少大寫字母的參數... –