1

さて、リスト内の2つの要素sとtの間の距離を見つける関数を作成しようとしています。

たとえば、s=bobおよびt=pizzaの場合:

(d 'bob 'pizza '(bob blah blah pizza))

それは戻ります:3

これは私がこれまでに持っているものです。

(define dist
 (lambda (s t line)
  (cond
   [(equal? s (car line))
     [(equal? t (car (cdr line)))
        1]]
   [else (add1 (dist s t (cdr line)))])))

何らかの理由で、動作していません。ヘルプ?

ありがとう!

4

3 に答える 3

3

問題の提案されたコードは機能しません。2つの要素がリスト内で隣接しているかどうかをチェックしているだけです。別のアプローチを試してみましょう。問題を小さなサブ問題に分割し、リスト内の要素のインデックスを返すプロシージャを定義することから始めます。インデックスはゼロから数えます。

(define (index-of elt lst)
  <???>) ; ToDo

s上記の手順を実行し、との両方tがリストに存在し、t後に表示されると仮定するsと、質問の解決策を簡単に見つけることができます。

(define dist
  (lambda (s t line)
    (- (index-of t line)
       (index-of s line))))

例えば:

(dist 'bob 'pizza '(bob blah blah pizza))
=> 3

追加のクレジットとして、要素の1つまたは両方がリストに存在しない場合(index-ofたとえば、これを示す値を返す必要がある場合#f)、またはリストのstに表示される場合を考慮してください。

于 2013-03-05T21:59:24.013 に答える
0

これは、リストを繰り返して「s」と「t」を毎回探すソリューションです。両方が見られると、結果が返されます。それ以外の場合は、探し続けます。

(define (dist s t line)
  (let looking ((l line) (n 0) (i #f))
    (and (not (null? l))
         (let ((item (car l)))
           (if (or (equal? item s)
                   (equal? item t))
               (if (not i)
                   (looking (cdr l) (+ n 1) n) ; found first, continue
                   (- n i))                    ; found second, done
               (looking (cdr l) (+ n 1) i)))))); continue looking
于 2013-03-05T23:56:12.730 に答える
0

最後のステップで(cdr line)を取っているときは、bobが最初の要素であっても、bobを捨てています。

あなたは3つそして多分4つのケースの世話をする必要があります。sとtが最初の2つの要素と一致する場合は、問題ありません。sが一致し、tが一致しない場合、2番目の要素が削除された行を使用して再帰呼び出しに1を追加する必要はありません。(cons(car line)(cdr(cdr line)))のようなもの。sが一致しない場合は、ラインの車を削除して再試行する必要があります。sとtの両方が発生することが確実であり、ライン不足に対処するために終了条件が必要な場合を除きます。

于 2013-03-05T21:52:18.537 に答える