Search code examples
listfunctionhelperindices

Trying to get the indices of an element from a list in scheme


So i'm trying to get the indices from a list ex:

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

(2 7)

where the index starts at 1 so 'A is index one

I was thinking on using a helper function where it takes an elt lst and index ex: (get-indices-helper el lst index)

I was also thinking about possibly using list-ref and like switching it to make it work in the get indices way however i could not find the actual scheme definition for it.


Solution

  • Write a function that recurses down the input list, keeping track of the position of the element that it's looking at, and emitting the matching indexes with cons. This is really trivial; I assume that it is a question that you have been set as homework?

    ; 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))
    

    Testing this with GNU Guile or MzScheme or something:

    (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)
    

    Prints:

    (2 7)
    (1 2 3 5)
    

    Yay!