LISP:计算子字符串以检查出现情况
好的,我有计算子字符串的代码,但一次只需要子字符串的输入,我如何让它接受更多的输入 也就是说,输入如下: (计数子“abcde”“a”“d”“e”“c”) 而不仅仅是:LISP:计算子字符串以检查出现情况,lisp,Lisp,好的,我有计算子字符串的代码,但一次只需要子字符串的输入,我如何让它接受更多的输入 也就是说,输入如下: (计数子“abcde”“a”“d”“e”“c”) 而不仅仅是: (count sub“abcd”“a”)我将使用它,以便一元函数具有不同的名称: (defun count-sub (str pat) (loop with z = 0 with s = 0 while s do (when (setf s (search pat str :start6 s))
(count sub“abcd”“a”)我将使用它,以便一元函数具有不同的名称:
(defun count-sub (str pat)
(loop with z = 0 with s = 0 while s do
(when (setf s (search pat str :start6 s))
(incf z) (incf s (length pat)))
finally (return z))))
那么,N元API函数只是一个reduce作业:
(defun count-sub-1 (str pat)
(loop with z = 0 with s = 0 while s do
(when (setf s (search pat str :start2 s)) ;; :start6 typo fixed
(incf z) (incf s (length pat)))
finally (return z))))
一些测试:
(defun count-sub (str &rest patterns)
(reduce #'+ patterns :key (lambda (item) (count-sub-1 str item))))
但是,您的逻辑中有一个bug。如果模式是空字符串,则会得到一个无限循环,因为(incf s(length pat))
不会更改s
的值:
(count-sub "aabc") -> 0
(count-sub "aabc" "a") -> 2
(count-sub "aabc" "a" "a") -> 4
(count-sub "aabc" "b") -> 1
(count-sub "aabc" "a" "b") -> 3
在零长度匹配的情况下,始终前进至少一个字符。在这种情况下,空字符串将在目标字符串中匹配多次;如果不希望出现这种情况(您希望空模式导致零),则必须对其进行检查:
(incf s (min (length pat) 1))
那么(最小(长度pat)1)
补偿是不必要的。不是(计数子“abcde”a“b”)
等于(+(计数子“abcde”a”)(计数子“abcde”b”)
?
(incf s (min (length pat) 1))
(if (plusp (length pat))
(loop ...)
0)