bool 列表 f# 的真值和长度

trues and length of bool list f#

直接使用递归,写一个函数truesAndLength : bool list -> int * int returns 列表的长度(在对的第一个组件中)和列表的数量 列表中为真的元素(在第二个组件中)。你的函数只能迭代 遍历列表的元素一次。 (请勿使用列表模块中的任何功能。)

到目前为止,这是我的代码:

let rec length bs =
    match bs with
    | [] -> 0
    | b::bs -> 1 + length bs

let rec trues bs = 
    match bs with
    | [] -> 0
    | b::bs -> if b = true then 1 + trues bs else trues bs

let truesandlength bs =
    let l = length bs
    let t = trues bs
    (l, t)

truesandlength [true; true; false]

这是通过迭代列表 2 次来实现的,我不知道如何只迭代 1 次。有什么提示吗?

根据您的评论,我建议您考虑 b::bs 案例:

  • 在列表的尾部递归调用truesAndLengths。这给你 tTail(真值的数量)和尾部的 lTail(长度)。
  • 根据 b 的值计算 tl 以获得完整列表。 (例如 llTail 多 1。)
  • Return t, l.

关键是只在代码中的一处递归调用 truesAndLengths,将其传递到列表的尾部。

let rec truesAndLength bs = 
  let sum a b = (fst a + fst b, snd a + snd b)
  match bs with
  | [] -> 0, 0
  | head::tail ->
    if head then sum (1,1) (truesAndLength tail) else sum (1, 0) (truesAndLength tail)