如何在F#中将带!前缀的变量字符串转换为二进制序列?
解决方案
针对你的需求,我们可以通过过滤无关字符 + 递归遍历的方式实现通用的转换逻辑,代码如下:
let convertToBinary (input: string) = // 过滤掉&、(、空格这些无关字符 let filteredChars = input |> Seq.filter (fun c -> not (List.contains c ['&'; '('; ' '])) // 递归处理字符序列,生成二进制字符串 let rec process remainingChars resultAccumulator = match remainingChars with | [] -> resultAccumulator |> List.rev |> System.String.Concat | '!' :: var :: rest when List.contains var ['p'; 'q'; 'r'; 's'] -> process rest ('0' :: resultAccumulator) | var :: rest when List.contains var ['p'; 'q'; 'r'; 's'] -> process rest ('1' :: resultAccumulator) | _ :: rest -> process rest resultAccumulator // 忽略意外出现的无关字符 process (filteredChars |> List.ofSeq) [] // 测试示例 printfn "%s" (convertToBinary "!p & !q & r & !s") // 输出 0010 printfn "%s" (convertToBinary "p & q & !r & s") // 输出 1101 printfn "%s" (convertToBinary "(!p)") // 输出 0
代码说明
- 过滤无关字符:用
Seq.filter把输入字符串里的&、(、空格全部剔除,只保留和变量相关的!、p、q、r、s。 - 递归遍历处理:
- 遇到
!后跟有效变量时,向结果中添加0,并跳过后面的变量字符。 - 直接遇到有效变量时,向结果中添加
1。 - 遇到其他意外字符时直接跳过,保证鲁棒性。
- 遇到
- 拼接结果:递归过程中结果是反向累加的,最后反转列表并拼接成最终的二进制字符串。
这个方法不用单独针对每个变量写判断逻辑,能一次性处理所有符合规则的输入,比你之前的实现更通用简洁。
内容的提问来源于stack exchange,提问作者Sai Keerthana Krishna Kumar
相关产品推荐
相关产品推荐

