1

リスト内の最も一般的な要素を返す次の再帰関数を実行しようとすると、clisp で「-Program stack overflow」プロンプトが表示されます。

(defun greater-member (lst)
  (cond  ((null (cdr lst))
                (cons (car lst) (count-if #'(lambda (x) (eql x (car lst))) lst)))
         ((>= (count-if #'(lambda (x) (eql x (car lst))) lst)
              (count-if #'(lambda (x) (eql x (car (remove (car lst) lst)))) lst))
                (greater-member (remove (car (remove (car lst) lst)) lst)))
         (t (greater-member (remove (car lst) lst)))))

たとえば、より大きい数は次のように返されます。

>(greater-number '(a a a b b b b c))
(b . 4)  

オーバーフローの原因は何ですか?clisp でgreater-numberを繰り返し実行することで、小さな構文エラーをすべて取り除きました。関数は論理的に保持されているようです。

4

2 に答える 2

6

私は今自分の間違いに気づきました。

ではなく、私のnullテストを見る

(null (cdr lst)) 

私が持っている必要があります

(null (remove (car lst) lst))

冗長で出現頻度の低い固有の要素が削除されるようにします。

于 2012-10-01T10:15:20.860 に答える
1

もう少し最適化されたバージョン:

(defun most-common (list)
  (let* ((len 0) (hash (make-hash-table))
         (max-occurences 0)
         key
         (max-possible
          (dolist (i list (ceiling len 2))
            (incf (gethash i hash 0))
            (incf len))))
    (maphash #'(lambda (a b)
                 (if (>= b max-possible)
                     (return-from most-common
                       (if (> b max-occurences) a key))
                     (progn
                       (when (> b max-occurences)
                         (setf key a max-occurences b))
                       (decf max-possible (max 1 (floor b 2))))))
             hash) key))
于 2012-10-01T12:28:49.400 に答える