(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))))对,所以我有这个计算子字符串的代码,但是它每次只需要子字符串输入,我如何让它接收更多的输入?
也就是说,输入类似于:
(数子"abcde“"a”d“e”"c")
而不是仅仅:(计数子"abcd“"a")
发布于 2016-12-13 01:59:46
为了使一元函数有一个不同的名称,我会使用它:
(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))))然后N-ary API函数只是一个约简任务,而不是这样:
(defun count-sub (str &rest patterns)
(reduce #'+ patterns :key (lambda (item) (count-sub-1 str item))))一些测试:
(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 (length pat)) 不会更改 s**:**的值。
(count-sub "abc" "") -> #<non-termination!>一个可能的解决办法是:
(incf s (min (length pat) 1))如果匹配长度为零,则始终前进至少一个字符。在这种情况下,空字符串将在目标字符串中匹配多次;如果这是不可取的(您希望一个空模式导致零),则必须对其进行检查:
(if (plusp (length pat))
(loop ...)
0)然后,(min (length pat) 1)补偿是不必要的。
https://stackoverflow.com/questions/29445087
复制相似问题