球拍功能调用计数

时间:2017-12-10 18:42:01

标签: sorting scheme racket function-calls

嘿所有,

因此,在我不断寻求学习更多Racket的过程中,我正在努力理解套装!调用以及它如何用作计数函数调用的计数器。

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

(count-compares sort compare? lst)

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

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

谢谢! < 3

2 个答案:

答案 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)