嘿所有,
因此,在我不断寻求学习更多Racket的过程中,我正在努力理解套装!调用以及它如何用作计数函数调用的计数器。
我编写了一些依赖于比较运算符的基本排序算法(合并,插入,快速)(即:<,>,< =),我想知道调用运算符的次数是多少次试着找出它的效率。我正在使用的代码格式是:
(count-compares sort compare? lst)
其中sort是我编码的排序方法,比较?是比较运算符,lst是要排序的整数列表。如果您认为有更好的方法,我愿意改变格式。
我知道比较?需要被中断(使用另一个函数??)来包含一个集合!,但我不知道该怎么做。有没有人对从哪里开始有任何建议?
谢谢! < 3
答案 0 :(得分:1)
mock包使得对compare?
等函数的计数调用变得更加容易。它提供了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
答案 1 :(得分:0)
您可以直接进行,无需任何包裹!
在var之外定义所有方法的外部: (定义count-comp 0)
到您的compare-function添加语句 (set!count-comp(+ count-comp 1))
以后使用 (显示计数 - 补偿) (set!count-comp 0)