如何编写一个函数来计算列表中元素的数量?
How to write a function to count the number of elements in a list?
如何使用 fold_left 而不是使用 fold 来编写函数来计算列表中的元素数?
我试过了
let rec count_elements l c =
match l with
|[] -> c
|h::t -> c = c+1
我不相信这行得通,我也不知道如何使用 fold_left,任何指导将不胜感激
使用fold_left
,你可以这样做:
# let size l = List.fold_left (fun acc _ -> acc + 1) 0 l;;
val size : 'a list -> int = <fun>
# size [1;2;3];;
- : int = 3
# size [];;
- : int = 0
#
您从累加器 0
开始,然后为列表中的每个元素添加它 +1
。
为了让答案更加清晰,我想强调一些事情:
fold_left
只是一种以尾递归方式对列表进行某些操作的方法。理解 fold_left
的最好方法是自己实现它:
# let fold_left f acc l =
let rec fr acc l =
match l with
| [] -> acc
| hd :: tl -> fr (f acc hd) tl
in fr acc l;;
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>
这正是你写时的长度
# let length l = List.fold_left (fun c _ -> c + 1) 0 l;;
val length : 'a list -> int = <fun>
发生的事情等同于:
# let length l =
let rec lr acc l =
match l with
| [] -> acc
| _ :: tl -> lr (acc + 1) tl
in lr 0 l;;
val length : 'a list -> int = <fun>
所以,解决方案
let rec length l =
match l with
| [] -> 0
| _ :: tl -> 1 + length tl
对应于fold_right
,不是尾递归。
希望这会为您澄清一些事情:-)
如何使用 fold_left 而不是使用 fold 来编写函数来计算列表中的元素数?
我试过了
let rec count_elements l c =
match l with
|[] -> c
|h::t -> c = c+1
我不相信这行得通,我也不知道如何使用 fold_left,任何指导将不胜感激
使用fold_left
,你可以这样做:
# let size l = List.fold_left (fun acc _ -> acc + 1) 0 l;;
val size : 'a list -> int = <fun>
# size [1;2;3];;
- : int = 3
# size [];;
- : int = 0
#
您从累加器 0
开始,然后为列表中的每个元素添加它 +1
。
为了让答案更加清晰,我想强调一些事情:
fold_left
只是一种以尾递归方式对列表进行某些操作的方法。理解 fold_left
的最好方法是自己实现它:
# let fold_left f acc l =
let rec fr acc l =
match l with
| [] -> acc
| hd :: tl -> fr (f acc hd) tl
in fr acc l;;
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>
这正是你写时的长度
# let length l = List.fold_left (fun c _ -> c + 1) 0 l;;
val length : 'a list -> int = <fun>
发生的事情等同于:
# let length l =
let rec lr acc l =
match l with
| [] -> acc
| _ :: tl -> lr (acc + 1) tl
in lr 0 l;;
val length : 'a list -> int = <fun>
所以,解决方案
let rec length l =
match l with
| [] -> 0
| _ :: tl -> 1 + length tl
对应于fold_right
,不是尾递归。
希望这会为您澄清一些事情:-)