1

私はリストを持っています

 L=(1 j 3 k 4 h 5 n 6 w)

最初の原子が2番目の原子の前にあるかどうかを検証する関数Verifyを実行する必要があります。これを確認したい:

> Verify(3 k)

結果が返されるはずです

> T

//アトム「3」はアトム「k」の前にあるため

そしてこの場合:

>Verify(h 4)

結果が返されるはずです

> NIL

//アトム'h'はアトム'4'の後にあるため

各要素の位置を確認して位置を比較する必要があります

4

2 に答える 2

2

Lispのどの方言を使用していますか?解決策を導き出す方法についてのいくつかの指針を以下に示します。空欄に記入してください。

(define (verify lst a b)
        ; what happens if there's only one element left in the list?
  (cond ((null? (cdr lst)) <???>)
        ; how do we check if the current element is equal to the `a` parameter
        ; and the next element is equal to the `b` parameter?
        (<???> T)
        ; how do we continue traversing the rest of the list?
        (else (verify <???> a b))))

;;; tests

(define lst '(1 j 3 k 4 h 5 n 6 w))

(verify lst 3 'k)
> T
(verify lst 'h '4)
> F
于 2012-04-24T18:52:03.417 に答える
1

これはCommonLispのワンライナーです:

(defun verify (list a b)
  (member b (member a list)))

nilTまたはNILを返すのではなく、「一般化されたブール値」( true以外の値)を返すことに注意してください。これはLispの基本的な概念です。

http://clhs.lisp.se/Body/26_glo_g.htm#generalized_boolean

これはまた、「前」が「前のどこか」を意味することを前提としています。あなたの宿題の問題は、「直前」の問題のようです。簡単に変更できるはずです。

于 2012-04-25T01:30:05.960 に答える