我一直在尝试实现马尔科夫算法,但我只取得了部分成功。该算法相当简单,可以在这里找到。
但是,我的项目有一个额外的困难,我必须使用包含标记和变量的规则。
变量代表字母表中的任何字母,标记只是一个字符,用作移动变量的参考(它没有实际值)。
此示例复制字符串中的每个字符:
字母:{a,b,c}
标记:{M}
变量:{x}
规则 1:Mx -> xxM
规则 2:xM -> x
规则 3:x -> Mx
输入: abc
abc //我们应用规则 3
Mabc //我们应用规则 1
aaMbc //我们应用规则 1
aabbMc //我们应用规则 1
aabbccM //我们应用规则 2
aabbcc
这是我的递归函数,它实现了仅适用于字符串输入的马尔可夫算法,例如:规则 1:“apple”->“orange”,输入:“apple”。
public static String markov(String input, LinkedList<Rule> rules) {
for (Rule rule : rules) {
if (!input.equals(input.replace(rule.getFrom(), rule.getTo()))) { //If the rule matches a substring
if (rule.isTerminating()) { //If the rule is terminating
input = input.replaceFirst(Pattern.quote(rule.getFrom()), rule.getTo());
System.out.println(input); //Replace the first instance
return input; //return and end the cycle
} else {
input = input.replaceFirst(Pattern.quote(rule.getFrom()), rule.getTo());
System.out.println(input);
return markov(input, rules); //Start looking again for matching rules
}
}
}
return input;
}
我不知道如何在这个逻辑中实现变量和标记,所以也许有人可以教育我实现这个逻辑的最佳方式?欢迎任何建议。
如果问题不符合 SO 准则,请在评论中告诉我原因,这样我就不会重复错误。
谢谢你!