OCaml 为pasA、pasB添加操作计数器的实现问题求助
OCaml 双函数独立操作次数统计实现
原有代码的运行问题
- 单计数器无法分离统计维度:仅定义了单个全局引用
i,所有计数都会累计到同一个变量中,没法分别得到pasA、pasB各自的执行次数,完全不符合练习要求。 - 类型不匹配导致编译报错:OCaml的分支表达式需要保证所有分支返回值类型一致,原代码中if分支返回整数0,else分支返回递归计算的整数,之后拼接的
incr()返回unit类型,直接触发类型不匹配的编译错误。 - 递归返回值链路断裂:顺序执行的表达式会返回最后一个表达式的结果,原代码最终会把
incr()的unit值作为函数返回值,和函数预设的整数计算逻辑完全脱节。
修正后的可运行实现
要实现两个函数的独立计数,需要为每个函数绑定专属的引用计数器,在函数入口触发计数动作,同时保证计算逻辑的返回值链路完整:
(* 为pasA、pasB分别创建独立计数器,初始值为0 *) let pasA_count = ref 0 let pasB_count = ref 0 let rec pasA n = pasA_count := !pasA_count + 1; (* 每次进入pasA即触发计数 *) if n = 0 then 0 else pasA (n - 1) and pasB n = pasB_count := !pasB_count + 1; (* 每次进入pasB即触发计数 *) if n = 0 then 0 else if n mod 2 = 0 then pasA (n - 2) else pasA (n - 1)
统计使用说明
每次正式统计前,先把两个计数器重置为0,完成目标参数的函数调用后,直接读取两个引用的值,就能拿到对应函数的实际执行次数。
示例流程:
(* 重置计数器 *) pasA_count := 0; pasB_count := 0; (* 执行需要测试的函数调用,例如测试pasB(4)的执行情况 *) let _ = pasB 4 in (* 输出统计结果 *) Printf.printf "pasA 执行次数:%d\npasB 执行次数:%d\n" !pasA_count !pasB_count
内容的提问来源于stack exchange,提问作者Jadiss Elantaki
相关产品推荐
相关产品推荐

