Ракетка итеративно предшествует процедуре
Я пытаюсь написать итеративную процедуру под названием предикаты, которая вводит список идентификаторов и два идентификатора из списка и возвращает #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