You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

代码说明

  1. 过滤无关字符:用Seq.filter把输入字符串里的&、(、空格全部剔除,只保留和变量相关的!、p、q、r、s。
  2. 递归遍历处理:
    • 遇到!后跟有效变量时,向结果中添加0,并跳过后面的变量字符。
    • 直接遇到有效变量时,向结果中添加1。
    • 遇到其他意外字符时直接跳过,保证鲁棒性。
  3. 拼接结果:递归过程中结果是反向累加的,最后反转列表并拼接成最终的二进制字符串。

这个方法不用单独针对每个变量写判断逻辑,能一次性处理所有符合规则的输入,比你之前的实现更通用简洁。

内容的提问来源于stack exchange,提问作者Sai Keerthana Krishna Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:51:03