球拍迭代先于程序

时间:2017-11-25 05:51:20

标签: racket

我正在尝试编写一个名为precedes的迭代过程,它从列表中输入一个标识符列表和两个标识符,如果第一个标识符出现在第二个之前,则返回#t,否则返回#f。

这是我的代码。

json.loads

此过程的示例输出为(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))

感谢。

1 个答案:

答案 0 :(得分:0)

亚历山大的言论是正确的;此外,您不会保留信息,无论您是否找到了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