2

F の代わりに '> を配置し、リスト L が '(1 2 3 4 5) の場合、1 つの関数 F と 1 つのリスト L の 2 つのパラメーターを持つ Lisp で関数を作成しようとしています。5 が最大であるため、5 が返されます。'< を入力すると、すべてのリスト要素が比較され、最も小さい要素が出力されます。等々。

比較のために、カスタム関数を F の代わりに配置することもできます。もっとサンプルコードを提供できればいいのにと思いますが、最初は本当に行き詰まっています。

(DEFUN givex (F L)
(cond
    (F (car L) (car (cdr L))
    ;after this i got stuck  
)
)

この関数を書くための別の試み

(defun best(F list)
    (if (null (rest list)) (first list)
    (funcall F (first List) (best (F list)))))
4

1 に答える 1

3

あなたはほとんどそこにいます.else句は要素fの代わりにの戻り値を返します:best

(defun best (F list)
  (let ((first (first list))
        (rest (rest list)))
    (if (null rest)
        first
        (let ((best (best f rest)))
          (if (funcall F first best)
              best
              first)))))

例:

(best #'< '(1 2 3))
==> 3
(best #'> '(1 2 3))
==> 1

この再帰的実装は末尾再帰的ではないため、最も効率的な実装ではないことに注意してください。代わりにこれを好むかもしれません:

(defun best (f list) 
  (reduce (lambda (a b) (if (funcall f a b) b a)) list))

または、さらに良いことに、

(defmacro fmax (f)
  `(lambda (a b) (if (,f a b) b a)))

(reduce (fmax <) '(1 2 3))
==> 1
(reduce (fmax >) '(1 -2 3 -4) :key #'abs)
==> 1
(reduce (fmax <) '(1 -2 3 -4) :key #'abs)
==> 4
于 2013-11-13T05:31:50.483 に答える