球拍函数调用计数

Racket Function Calls Count

大家好,

因此,在我永无止境地学习更多球拍的过程中,我正在努力了解 set!调用以及如何将其用作计算函数调用的计数器。

我编写了一些依赖于比较运算符(即:<、>、<=)的基本排序算法(合并、插入、快速),我想知道该运算符被调用了多少次来尝试并计算出它的效率。我正在使用的代码格式是:

(count-compares sort compare? lst)

我编码的排序方式sort在哪里,对比一下?是比较运算符,lst 是要排序的整数列表。如果您认为有更好的方法,我愿意更改格式。

我知道比较?需要中断(使用另一个功能??)来包含一个集合!,但我不知道该怎么做。有人对从哪里开始有任何建议吗?

谢谢! <3

计算模拟函数被调用次数的mock package makes counting calls of functions like compare? much easier. It provides the mock-num-calls函数。

#lang racket

(require mock)

;; count-compares :
;; ∀[X] [(Listof X) [X X -> Bool] -> (Listof X)] [X X -> Bool] (Listof X) -> Nat
(define (count-compares sort compare? lst)
  ; mock-compare? is a function that behaves just like compare?, except that
  ; it keeps track of the information of how it's called, so that it can be
  ; counted later.
  (define mock-compare? (mock #:behavior compare?))
  ; sort the list using the mock function
  (sort lst mock-compare?)
  ; count the number of times the mock function was called
  (mock-num-calls mock-compare?))

尝试一下:

(count-compares sort < '(6 2 8 3 1 8 5 3 0 7 1 7 9 5 8))
; 41, in Racket version 6.11

不用任何包直接搞定!

在所有方法之外定义一个var: (定义 count-comp 0)

在你的比较函数中添加语句 (set!count-comp (+ count-comp 1))

以后使用 (显示计数补偿) (set!count-comp 0)