2017-09-23 9 views
0

가 문제이다 값 길이) 여기서 첫 번째 요소는 값이고 두 번째 요소는 값이 인코딩 된 목록에서 발생하는 횟수입니다. 예를 들어반응식 런 렝스 부호화

: 나는 정말의 수를 계산하는 방법을 생각 질수 있기 때문에

(define (encode lst) 
    (cond 
    ((null? lst) '()) 
    (else ((append (list (car lst) (count lst 1)) 
        (encode (cdr lst))))))) 

(define (count lst n) 
    (cond 
    ((null? lst) n) 
    ((equal? (car lst) (car(cdr lst))) (count (cdr lst) (+ n 1))) 
    (else (n))))) 

그래서 나는이 늘 일을 알고

(encode '(1 1 2 4 4 8 8 8)) ---> ((1 2)(2 1)(4 2)(8 3)) 

이것은 내가 지금까지 가지고있는 코드입니다 특정 원자를 효과적으로 목록에서 반복 할 수 있습니다. 또한 이전 (값 길이) 쌍을 저장 한 후 목록의 다음 고유 원자를 계산합니다. 기본적으로, 내 주요 문제는 비록 내 (값 길이) 쌍을 만드는 목록에서 볼 수있는 원자의 양을 유지하는 방법을 생각해 내고있다.

답변

1

추가 인수로 개수가있는 도우미 함수가 필요합니다. 첫 번째 두 요소를 서로 비교하여 검사하고 나머지 요소가 일치하는 경우 일치 횟수를 늘리거나 재귀 호출에서 개수를 1로 재설정하고 재귀 호출을 반복합니다.

상태 변수와 재귀 도우미 절차를 사용하는이 기술은 그렇게하는 이름 let 표현을 사용

(define (encode lst) 
    (define (helper lst count) 
    (cond ((null? lst) <??>) 
      ((null? (cdr lst)) <??>)) 
      ((equal? (car lst) (cadr lst)) <??>) 
      (else (helper <??> <??>)))) 
    (helper lst 1)) 

;; tests 
(encode '())    ; ==>() 
(encode '(1))    ; ==> ((1 1)) 
(encode '(1 1))   ; ==> ((1 2)) 
(encode '(1 2 2 3 3 3 3)) ; ==> ((1 1) (2 2) (3 4)) 

: 여기

당신이 <??> 부분을 구현해야 스케치입니다 Scheme에서 일반적으로 패턴을 조금 더 멋지게 표현할 수있는 let 양식이 있습니다.

질문의 코드에 515,
(define (encode lst) 
    (let helper ((lst lst) (count 1)) 
    (cond ((null? lst) <??>) 
      ((null? (cdr lst)) <??>)) 
      ((equal? (car lst) (cadr lst)) <??>) 
      (else (helper <??> <??>))))) 

댓글 : 그것은 여분의 괄호가 있습니다 ..

((append ....)) 수단은 함수 인 것처럼 그 결과를 전화 (append ....)를 호출합니다. append 이후는 비참하게 실패 할 목록을 ERROR: application: expected a function, got a list과 같이 만듭니다.

(n)n과 같이 변수 일뿐입니다. +은 과 같은 변수입니다. Scheme에서 함수와 다른 값 사이에 차이가 없으며 (if (< v 3) + -)과 같은 표현식을 사용할 때 괄호로 묶어서 호출하면 함수로 평가해야합니다. ((if (< v 3) + -) 5 3); ==> 8 or 2

+0

이 코드를 올바르게 구현하고 코드를 추가 할 수있었습니다. 필요합니다. 이 모든 것이 지금 내게 훨씬 더 의미가 있습니다. – Frank

+1

@Frank을 도와 드리겠습니다. 변수를 변경하는 것을 모방하는 인수를 추가하는 트릭은 대개 Scheme의 문제에 대한 해결책입니다. Scheme에는 함수 이름 지정을 잃지 않고 let처럼 쓸 수있는'let '이라는 이름이 있습니다. – Sylwester

+0

@Sylwester 귀하의 의견에 설명 된 이름의'let' 양식을 사용하는 코드의 변형을 추가했습니다.^_^ – naomik