递归和互递函数

你可以使用 rec 关键字定义要递归的函数,以便它可以调用自身。

# let rec fact n = match n with
    | 0 -> 1
    | n -> n * fact (n - 1);;

val fact : int -> int = <fun>

# fact 0;;
- : int = 1
# fact 4;;
- : int = 24

你还可以使用 and 关键字定义相互递归函数,以便它们可以相互调用。

# let rec first x = match x with
    | 1 -> 1
    | x -> second (x mod 10)

  and second x = first (x + 1);;

val first : int -> int = <fun>
val second : int -> int = <fun>

# first 20;;
- : int = 1
# first 12345;;
- : int = 1

请注意,第二个函数没有 req 关键字。