2013-08-12 3 views
0

Я пытаюсь получить список позиций значения в списке на промежуточном студенческом языке.DrRacket: как получить позицию значения в списке

Например, я хочу список позиций для значения «А» в следующем списке

(list false A false false false false A false false false)

Выход должен быть чем-то вроде

(list 1 6)

+2

Вам необходимо включить код, который вы уже пробовали, и каким был результат (например, произошла ошибка (включите его), результат отличается от ожидаемого (включая его) и т. Д.). – Michelle

ответ

0

Я дам вам некоторые подсказки для решения этой проблемы, гораздо лучше, если вы достигнете решения своими силами. Заполняющая пробелы:

; position procedure 
; lst: input list 
; ele: the searched element 
; idx: initial index, starts in 0 
(define (position lst ele idx) 
    (cond (<???>  ; if the input list is empty 
     <???>)  ; then we're done, return the empty list 
     (<???>  ; if the current element equals the one we're looking then 
     (cons <???> ; build output list, cons the index where we found it 
       (position <???> ele <???>))) ; and advance the recursion 
     (else        ; otherwise 
     (position <???> ele <???>))))  ; just advance the recursion 

Обратите внимание, что параметр idx необходимо следить за индексом, мы находимся в настоящее время более, начиная с нуля. Когда рекурсия продвигается вперед, вы должны продвигать как входной список, так и индекс. Не забудьте проверить процедуру:

(position '(false A false false false false A false false false) 'A 0) 
=> '(1 6) 
0

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

Так,

; listsearch : (listof Any) Any -> (listof Int) 
; Searches a list for val and returns a list of indexes for occurrences of val in lst 
; (listsearch '(1 2 1 3 4 1) 1) => '(0 2 5) 
(define (listsearch lst val) 
    (local [(define (helper lst acc counter) 
      (cond [(empty? lst)    acc] 
        [(equal? val (first lst)) (helper (rest lst) 
                (cons counter acc) 
                (add1 counter))] 
        [else      (helper (rest lst) acc (add1 counter))]))] 
    (reverse (helper lst empty 0)))) 

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

Это просто просматривает список по одному, и делает три проверки

  • ли список пуст? Верните мой накопленный список (база пуста)
  • Является первым в списке моим значением? Начните снова, но добавьте это значение в мой аккумулятор и добавьте его к моему счетчику.
  • Это первый элемент в списке что-то еще? Начните снова, но добавьте один к моему счетчику

Это приводит к обратному списку, поэтому мы отменяем его в конце.

Вот и все! :)

Смежные вопросы