2011-12-02 3 views
0

숫자와 쌍 목록을받는 함수를 작성하여 쌍 목록을 반복하고 첫 번째 항목과 두 번째 항목 사이의 나누기 결과를 제거합니다. 요소와 같은 쌍의 두 번째 요소는 인수로 전달 된 숫자와 다릅니다. 결국 분할의 결과가 같은 목록 만 반환합니다.Lisp - 쌍 목록에서 인스턴스 제거

나는 지금까지 다음과 같은 코드가 있습니다 :

(defun retira-terco(num l1) 
(cond ((null l1)()) 
    ((not (equal num (/ (car(first l1)) (cdr(first l1))))) 
         (retira-terco num (rest l1))) 
    (t (cons (first l1) (retira-terco num (rest l1)))))) 

나는 다음과 같은 오류 얻을 실제 예제이 예제를 실행하려고 :

Error: `(1)' is not of the expected type `NUMBER' 

내가 잘못하고 있어요 무엇을?

(/ (car(first l1)) (cdr(first l1)))

(car (first l1))

가 숫자로 평가하지만, (cdr (first l1))는리스트로 평가

+0

그래서 모든 숫자 쌍을 조합하여 숫자를 구하려면 어떻게 되나요? – Luke

+0

조건을 확인하는 pais 목록을 반환하고 싶습니다. 분할 수는 수와 같습니다. 난 원래 목록에서 요소를 제거하고 싶습니다. –

답변

6

코드의 문제는이 라인에있다. 아마도 (cadr (first l1))을 의미했을 것입니다.

즉,이 코드는 묵시 적 관점에서 큰 코드가 아닙니다. 필터링 할 조건이 있습니다. 고차 프로그래밍을 사용하면 다음과 같이 표현할 수 있습니다.

(defun foo (num lst) 
    (remove-if (lambda (item) 
       (equal num 
         (/ (car item) 
          (cadr item)))) 
       lst))) 
+0

감사합니다. 나는 그것을 시도 할 것입니다. –