2013-08-12 2 views
0

중급 학생 언어 목록에서 값의 위치 목록을 가져 오려고합니다.DrRacket : 목록에서 값의 위치를 ​​얻는 방법

는 예를 들어 내가 당신을주지

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

출력은해야 뭔가

(list 1 6)

+2

이미 시도한 코드와 그 결과 (예 : 오류 (포함)), 예상 결과 (예상 오류 포함) 등)를 포함해야합니다. – Michelle

답변

0

처럼 다음 목록에서 값 "A"에 대한 위치의 목록을 기원합니다 이 문제를 해결하기위한 몇 가지 힌트가 있습니다. 솔루션을 직접 구현하면 훨씬 좋습니다. 강제에 공백 다음 idx 매개 변수는 우리가 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 

공지있다. 재귀가 진행되면 입력 목록과 색인을 모두 향상시켜야합니다. 절차 테스트하는 것을 잊지 마세요 :

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

나는 지역을 추가 한, 그러나 우리는 실제 기능은 깔끔한되고 싶어요, 그래서 전화는 단순히 목록과 값을 필요로한다.

이것은 단순히 목록 하나 하나를 통과, 3 확인

  • 목록이 비어한다? 누적 된 목록 반환 (기본은 비어 있음)
  • 목록의 첫 번째 항목이 내 값입니까? 다시 시작하지만 누적기에 해당 값을 추가하고 내 카운터에 값을 더하십시오.
  • 목록의 첫 번째 항목이 다른 것입니까? 다시 시작하지만 내 카운터에 하나 추가하십시오.

이렇게하면 거꾸로 목록이 만들어 지므로 끝에 반대로 표시됩니다.

그게 전부 야! :)