2017-11-25 6 views
0

私はリストの識別子と2つの識別子のリストを入力する先行の手続きを書こうとしています。ラケットの反復は手続きに先だって

これは私のコードです。

(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

おかげです。

+0

あなたはiter' 'に空のリストを渡している、(ヌル'によって生成ので、 '#のF'出力?lst) '。また、lstが識別子シンボルのリストであることを意図している場合、その要素と 'n'(数値)が等しいかどうかをチェックすることはあまり意味がありません。一方、 'x'は、' iter'手続きでは完全に使用されていません。 – assefamaru

答えて

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 
関連する問題