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
的值计算 t
和 l
以获得完整列表。 (例如 l
比 lTail
多 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)
直接使用递归,写一个函数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
的值计算t
和l
以获得完整列表。 (例如l
比lTail
多 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)