2012-01-16 51 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