2012-01-16 50 views
3

我是Ocaml的新手。我遇到的问题是跟踪函数中递归调用的数量。保留Ocaml递归调用数的计数

举例来说,我写了下面的函数:

let rec someFunction n = 
    let digi = someOtherFunction n in 
    match digi with 
    | x when x > 123 -> someFunction digi 
    | x -> [want to output # of recursive calls] ;; 

我如何去这样做呢?我试图创建一个变量,但它只是保持重置为其初始值,如果我有一些功能。我基本上想要做的是这样的:

 while (x > 123) { 
    count++; 
    someFunction(x); 
    } 

    return count; 

请原谅我,如果这是非常平凡的事情。

回答

2

首先,我对你想用柜台做什么感到困惑,你不想让它数到123吗?这并不意味着你需要:

while (count < 123) { count++; someFunction(count); } 

......这意味着你可以计算它被调用的次数,直到它达到123,然后退出。

如果你想保留多少次的函数被调用了,直到一定的限制计数,那么你可以使用这样的裁判:

let someFunction n = 
    let count = ref 0 in 
    let rec aux() = 
    if !count >= n then count 
    else (
     incr count; 
     (* do the stuff you wanted to do in someFunction here *) 
     aux()) in 
    aux() ;; 

如果你想避免可变状态(通常是好主意),那么你可以这样做没有一个裁判:

let someFunction n = 
    let rec aux count = 
     if count >= n then count 
     else aux (count+1) in 
    aux 0 ;; 

也许这就是你想要做的?:

let someOtherFunction n = 
    Printf.printf "n is: %d\n" n;; 

let someFunction n f = 
    let rec aux count = 
    if count >= n then count 
    else (
     f count; 
     aux (count+1) 
    ) in 
    aux 0 ;; 

# someFunction 10 someOtherFunction ;; 
n is: 0 
n is: 1 
n is: 2 
n is: 3 
n is: 4 
n is: 5 
n is: 6 
n is: 7 
n is: 8 
n is: 9 
- : int = 10 
什么

如果,另一方面,你要跟踪的someFunction被调用多少次,那么你就需要在同一作用域级别的someFunction定义,裁判柜台,是这样的:

let count = ref 0 ;; 
let rec someFunction n f = 
    if !count >= 123 then count 
    else (
    incr count; 
    f n; 
    someFunction n f 
) ;; 
+0

编辑:对不起,没有刷新页面,我正在阅读你现在写的东西 – Kevin 2012-01-16 04:23:27

+0

也许我原来的代码片段不清楚;我只想记录递归调用someFunction的次数。这对我来说仍然非常混乱,我试图理解你现在写的东西。 – Kevin 2012-01-16 04:30:32

+0

@ user1151063:尝试再次刷新并查看最后一个代码片段 - 就我所知,这就是您试图在问题的代码中实现的内容。 – aneccodeal 2012-01-16 04:39:38

1

有有几种方法可以做到这一点。一个是用你写的while循环来做,但是引用允许变量能够改变值。

let x := starting_value; 
let count := 0; 
while (!x > 123) do (
    count := count + 1; 
    x := someFunction(x) 
    ) done; 
!count 

或者,如果你想要写纯粹的功能代码,你可以添加一个辅助函数,像这样:

let someFunction n = 
    let rec someFunctionHelper n count = 
     let digi = someOtherFunction n in 
     match digi with 
     | x when x > 123 -> someFunctionHelper digi (count + 1) 
     | x -> count 
    in 
     someFunctionHelper n 0 

第二种方法是我会怎么写。从本质上讲,我们只是用一个替代版本替换原始代码中的一些函数,该替代版本需要一个额外的参数来指示它迄今为止被调用了多少次。当我们第一次调用它时(函数的最后一行),我们从零开始,然后在这之后,我们传递一个比我们每次得到的更高的数字。

+0

感谢您的帮助! – Kevin 2012-01-19 03:13:32