如何计算(递归)函数在 ocaml 中执行自身的次数?

how do I count the amount of times a (recursive) function executes itself in ocaml?

在如何计算递归函数自身执行的次数方面需要一些帮助(如果可能的话)。 我不知道如何在 OCaml 中制作某种计数器。 谢谢!

您可以像这样在任何更高范围内创建引用

let counter = ref 0 in
let rec f ... =
  counter := !counter + 1;
  ... (* Function body *)

如果更高的范围恰好是模块范围(或文件 top-level 范围)你应该省略 in

您可以 return 一个元组 (x,y),其中 y 在每次递归调用时递增 1。如果你做一个 Schroder 序列,它会很有用 ;)

让我们考虑一个非常简单的递归函数(不是 Schroder,因为我不想为您做功课)来计算斐波那契数。

let rec fib n =
  match n with
  | 0 | 1 -> 1
  | _ when n > 0 -> fib (n - 2) + fib (n  - 1)
  | _ -> raise (Invalid_argument "Negative values not supported")

现在,如果我们想知道它被传入了多少次,我们可以让它接受一个电话号码和 return 一个更新了该电话号码的元组。

为了获取每个更新的调用计数并传递它,我们在 let 绑定中显式调用 fib。每次 c 隐藏其先前的绑定,因为我们不需要该信息。

let rec fib n c =
  match n with
  | 0 | 1 -> (1, c + 1)
  | _ when n > 0 -> 
    let n',  c = fib (n - 1) (c + 1) in
    let n'', c = fib (n - 2) (c + 1) in
    (n' + n'', c)
  | _ -> raise (Invalid_argument "Negative values not supported")

我们可以隐藏它,不必在第一次调用时显式传递 0

let fib n = fib n 0

现在:

utop # fib 5;;
- : int * int = (8, 22)

相同的模式可以应用于您尝试编写的 Schroder 函数。