Ракетка итеративно предшествует процедуре

Я пытаюсь написать итеративную процедуру под названием предикаты, которая вводит список идентификаторов и два идентификатора из списка и возвращает #t, если первый из этих идентификаторов встречается перед вторым, в противном случае #f.

Это мой код

(define (precedes id1 id2 lst)
  (define (iter lst n x)
    (cond ((null? lst) #f)
          ((eq? (car lst) n) #t)
              (else (iter (cdr lst) (+ 1 n) x))))
  (iter '() 0 1)) 

Пример вывода этой процедуры (precedes 'e 'c '(d b e a c g f)) = #t

Благодарю.

1 ответ

Решение

Замечания Александра верны; Кроме того, вы не сохраняете информацию, нашли ли вы id1. Вот пример, как вы могли бы сделать:

(define (precedes id1 id2 lst)
  (define (iter lst foundid1)
    (printf "~a ~a\n" lst foundid1) ; for debugging
    (cond ((null? lst)
           #f)  ; never found id2 so #f
          ((eq? (car lst) id2)
           foundid1) ; found id2 so result is whether we found id1 before         
          ((eq? (car lst) id1)
           (iter (cdr lst) #t)) ; found id1 so iterate, set found flag to #t
          (else
           (iter (cdr lst) foundid1)))) ; found nothing, iterate
  (iter lst #f))

и вот вывод:

> (precedes 'e 'c '(d b e a c g f))
(d b e a c g f) #f
(b e a c g f) #f
(e a c g f) #f
(a c g f) #t
(c g f) #t
#t

> (precedes 'x 'c '(d b e a c g f))
(d b e a c g f) #f
(b e a c g f) #f
(e a c g f) #f
(a c g f) #f
(c g f) #f
#f

> (precedes 'x 'y '(d b e a c g f))
(d b e a c g f) #f
(b e a c g f) #f
(e a c g f) #f
(a c g f) #f
(c g f) #f
(g f) #f
(f) #f
() #f
#f
Другие вопросы по тегам