2012-11-13 3 views
1

이 스키마 코드를 이해할 수 없습니다. Compute-frequencies는 2 개의 분리 된 목록을 찾고자하는 목록과 풀 목록을 취합니다. 찾고있는 목록의 모든 항목이 풀 목록에있는 횟수를 나타내는 목록을 반환해야합니다. 풀리스트를 통해 재귀 호출을 수행 한 후에 가장 큰 오류가 발생할 가능성이 거의 없습니다.스키마 목록 조작

(define (compute-frequencies looking-for-list pool-list) 
    (define (helper looking-for-list pool-list current-frequency frequency-list) ; keeps track of finished list and iterates through both lists 
    (if (null? looking-for-list) (reverse frequency-list)      ; finding the number of times data in looking-for-list are in pool-list 
    (if (null? pool-list) 
     (helper (cdr looking-for-list) pool-list 0 (cons current-frequency frequency-list)) 
     (if (equal? (car looking-for-list) (car pool-list)) 
     (helper looking-for-list (cdr pool-list) (+ 1 current-frequency) frequency-list) 
     (helper looking-for-list (cdr pool-list) current-frequency frequency-list))))) 

(helper looking-for-list pool-list 0 '())) 
+0

하위 문제로 분류하면이게 훨씬 쉽습니다. 먼저 목록에서 하나의 항목의 빈도를 계산 한 후 '계산 빈도'에 사용하는 함수를 정의하십시오. 그렇다면 각 함수에서 하나의 목록을 되풀이하는 것에 대해 걱정할 필요가 있습니다. – molbdnilo

답변

2

코드를 읽는 것이 알고리즘 자체가 완벽하게 괜찮아 보입니다. 문제는 훨씬 간단합니다.

looking-for-list의 첫 번째 요소에 대해 pool-list의 모든 요소를 ​​확인한 후에 pool-list을 원래 상태로 복원하려고하면 코드를 살펴보십시오. 이렇게하려면 helper으로 pool-listpool-list으로 지정합니다. 당신은 거의 확실하게 compute-frequency 인수에 정의 된 것을 의미하지만 Scheme은 helper의 인수를 취합니다. compute-frequency에 그림자가 있기 때문입니다. 즉 첫 번째 반복 이후에 pool-list'()이므로 다른 모든 빈도는 0입니다.

이 문제를 해결하려면 이름을 변경하십시오. 앞으로는 Scheme 변수가 더 큰 범위에서 그 변수들을 숨길 수 있다는 것을 기억하십시오. 또한 중첩 된 if 문 대신 cond을 사용해보십시오. Scheme에서 훨씬 더 읽기 쉽습니다 (이 문제를 발견 한 방법입니다)

+0

오 이런. .. 고마워! –

+1

체크 표시를 클릭하는 것을 잊지 마세요. @jozefg가 답변에 공헌합니다! –