Попытка получить индексы элемента из списка в схеме - PullRequest
1 голос
/ 19 марта 2011

Итак, я пытаюсь получить индексы из списка, например:

(get-индексы 'G (список' A 'G' T 'X' I 'T' G))

(2 7)

где индекс начинается с 1, поэтому 'A является индексом один

Я думал об использовании вспомогательной функции, где она берет elst lst и index например: (get-index-helper el lst index)

Я также думал о возможном использовании list-ref и о том, как его переключать, чтобы заставить его работать способом получения индексов, однако я не смог найти фактическое определение схемы для него.

1 Ответ

3 голосов
/ 20 марта 2011

Напишите функцию, которая повторяет список ввода, отслеживая положение элемента, на который она смотрит, и испуская соответствующие индексы с помощью 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)

Yay!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...