說我有一個遞歸函數,我想知道函數每次輸入值調用它自己的次數。而不是把printf表達式或改變返回類型以包含調用次數,是否有可能用另一個「包裝」這個函數來實現這個功能?我希望包裝函數返回函數調用的數量和原始函數的結果。它應該可以跨不同的功能重用。包裝一個遞歸函數來計算函數調用的數量
這是我有,它不工作。
open System
open System.IO
open System.Collections.Generic
/// example recursive function
let rec getfilenames dir =
seq {
yield Directory.GetFiles dir
for x in Directory.GetDirectories dir do yield! getfilenames x}
/// function to count the number of calls a recursive function makes to itself
let wrapped (f: 'a -> 'b) =
let d = new Dictionary<'a, int>()
fun x ->
let ok, res = d.TryGetValue(x)
if ok then d.[x] <- d.[x] + 1
else
d.Add(x, 1)
d, f x
> let f = wrapped getfilenames
let calls, res = f "c:\\temp";;
val f : (string -> Dictionary<string,int> * seq<string []>)
val res : seq<string []>
val calls : Dictionary<string,int> = dict [("c:\temp", 1)]
我被困在2點,註釋掉字典,現在應該去哪裏類型?在包裝函數最後一行f recfun x我不明白這是如何工作:( – yanta 2010-11-13 16:25:27
字典:與以前一樣(唯一的區別是,現在f的類型是'('a - >'b) - > 'a - >'b',因爲它期望'recfun')。'recfun'表示在子目錄中應該由'f'調用的函數(因爲'f'不是遞歸的)。這讓你使用計數函數來處理子目錄 – 2010-11-13 16:30:29
let calls,counted_body = wrap body ;; 錯誤FS0030:值限制。當'_a:> seq –
yanta
2010-11-13 16:38:14