1

だから私はリストからインデックスを取得しようとしています例:

(get-indices'G(list' A'G' T'X' I'T' G))

(2 7)

ここで、インデックスは1から始まるため、'Aはインデックス1です。

eltlstとindexexをとるヘルパー関数の使用を考えていました:(get-indices-helper el lst index)

また、list-refを使用して、インデックスを取得する方法で機能させるように切り替えることも考えていましたが、実際のスキーム定義を見つけることができませんでした。

4

1 に答える 1

3

入力リストを再帰的に処理し、参照している要素の位置を追跡し、一致するインデックスを。で出力する関数を記述しますcons。これは本当に些細なことです。宿題になっているのは質問だと思いますか?

; Walk down the list given in haystack, returning a list of indices at which
; values equal? to needle appear.
(define (get-indices needle haystack)
  ; Loop along the haystack.
  (define (loop rest-of-haystack index)
    ; If the haystack is empty, return the empty list.
    (if (null? rest-of-haystack) '()
      ; Recurse to the next position in the list.
      (let ((rest-of-indices (loop (cdr rest-of-haystack) (+ index 1))))
        (if (equal? (car rest-of-haystack) needle)
          ; If haystack is here, emit the current index.
          (cons index rest-of-indices)
          ; Otherwise, return rest-of-indices.
          rest-of-indices))))
  ; Run the loop defined above, from the beginning of haystack, with
  ; the first element being assigned an index of 1.
  (loop haystack 1))

GNU GuileやMzSchemeなどでこれをテストします:

(display (get-indices 'G (list 'A 'G 'T 'X 'I 'T 'G))) (newline)
(display (get-indices 1 (list 1 1 1 2 1 3))) (newline)

プリント:

(2 7)
(1 2 3 5)

わーい!

于 2011-03-19T22:20:53.917 に答える