【发布时间】:2020-12-07 13:13:11
【问题描述】:
当我们使用 Knuth-Morris-Pratt 算法时,这是在 Scheme 中计算失败函数(我们必须返回多少步)的代码:
(define (compute-failure-function p)
(define n-p (string-length p))
(define sigma-table (make-vector n-p 0))
(let loop
((i-p 2)
(k 0))
(cond
((>= i-p n-p)
(vector-set! sigma-table (- n-p 1) k))
((eq? (string-ref p k)
(string-ref p (- i-p 1)))
(vector-set! sigma-table i-p (+ k 1))
(loop (+ i-p 1) (+ k 1)))
((> k 0)
(loop i-p (vector-ref sigma-table k)))
(else ; k=0
(vector-set! sigma-table i-p 0)
(loop (+ i-p 1) k))))
(vector-set! sigma-table 0 -1)
(lambda (q)
(vector-ref sigma-table q)))
但我不明白k > 0时的部分。谁能解释一下?
【问题讨论】:
-
有什么问题?是语法,还是
loop的含义,还是算法本身? -
@OscarLopez 它是关于循环的含义。我不明白那部分。
-
代码使用了“命名
let”,它只是定义帮助程序的快捷方式,名称loop是任意的。(loop ...)行正在调用该过程。这是一种使用递归调用实现迭代的方法。 -
谢谢!但我不明白为什么写 « i-p (vector-ref sigma-table k) » for k>0?
标签: algorithm scheme knuth-morris-pratt