如何计算(递归)函数在 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 函数。
在如何计算递归函数自身执行的次数方面需要一些帮助(如果可能的话)。 我不知道如何在 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 函数。